动态创建为WPF表单的用户控件上的按钮单击事件

时间:2019-05-29 17:51:21

标签: c# wpf

我正在基于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事件。

任何帮助将不胜感激。

我已经进行了多项研究,但没有找到帮助。我发现的是带有click事件的用户控件。但是,用户控件在运行时不是动态的。

我希望执行将客户端添加或更新到列表中的操作,以便稍后在项目中执行任务。

1 个答案:

答案 0 :(得分:0)

欢迎来到。

每次需要在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>