Событие нажатия кнопки на пользовательском элементе управления, динамически создаваемом в форму WPF - PullRequest
0 голосов
/ 29 мая 2019

Я добавляю пользовательские элементы управления во время выполнения, основываясь на запросе базы данных XML-данных. Таким образом, количество пользовательских элементов управления отличается.

Кроме того, учитывая тип полученного XML, я не могу привязать пользовательский элемент управления к списку, созданному из данных XML, потому что будут случаи, когда я буду извлекать различные поля в зависимости от того, является ли это новый клиент по сравнению с существующим клиентом. Для существующего клиента есть только 8 полей. Новому клиенту нужно 40 или 50 полей.

Я создаю один из двух пользовательских элементов управления на основе нового клиента и существующего клиента.

Я считаю, что это то, что нужно для пользовательского элемента управления.

Вот фрагмент кода.

public event RoutedEventHandler btnAddClient_Click;

private void OnButtonClick(object sender, RoutedEventArgs e)
{
    if(btnAddClient_Click !=null)
        {
            btnAddClient_Click(this, new RoutedEventArgs());
        }
}
public ucNewClient()
{
    InitializeComponent();
}

Мне нужно знать, как установить событие click для динамически создаваемого пользовательского элемента управления, а также для главной формы.

Любая помощь будет принята с благодарностью.

Я провел несколько исследований и не нашел помощи. То, что я нашел, было пользовательскими элементами управления с событием щелчка. Однако пользовательский элемент управления не был динамически / во время выполнения.

Я ожидаю выполнить действие по добавлению или обновлению клиента в списке, чтобы выполнить задачи позже в проекте.

1 Ответ

0 голосов
/ 30 мая 2019

Добро пожаловать в SO.

Каждый раз, когда вам нужно отобразить список элементов в WPF, вы должны использовать ItemsControl или один из его производных классов.Начните со списка элементов данных, которые вы хотите отобразить в вашей модели представления (или независимо от того, какой ваш DataContext установлен):

    private ObservableCollection<SomeBaseClass> _MyItems;
    public ObservableCollection<SomeBaseClass> MyItems
    {
        get { return this._MyItems; }
        set
        {
            if (this._MyItems != value)
            {
                this._MyItems = value;
                RaisePropertyChanged(() => this.MyItems);
            }
        }
    }

Затем вы объявляете ItemsControl, который привязывается к этому списку:

 <ItemsControl ItemsSource="{Binding MyItems}" />

Вертикальная панель стека является панелью макета по умолчанию, но вы можете изменить ее на что-то другое, если вам нужно.В любом случае вы затем создаете шаблон данных для каждого типа данных, которые вы хотите отобразить:

<Window.Resources>

    <DataTemplate DataType="{x:Type local:DataTypeA">
        <TextBlock Text="This is data type A" />
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:DataTypeB">
        <TextBlock Text="This is data type B" />
    </DataTemplate>

   ... etc ...

</Window.Resources>

И это все!

Иногда вам захочется отображать вещи по-разному в зависимости от фактических данныхсам по себе, и в этом случае вы можете использовать один шаблон данных с триггерами данных вместо:

<ControlTemplate x:Key="TemplateA">
    <TextBlock Text="This is template A" />
</ControlTemplate>

<ControlTemplate x:Key="TemplateB">
    <TextBlock Text="This is template B" />
</ControlTemplate>

<DataTemplate DataType="{x:Type local:SomeBaseClass}">
    <ContentControl Content="{Binding}">
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SomeProperty}" Value="ValueA">
                        <Setter Property="Template" Value="{StaticResource TemplateA}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SomeProperty}" Value="ValueB">
                        <Setter Property="Template" Value="{StaticResource TemplateB}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...