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

Posted

技术标签:

【中文标题】动态创建到 WPF 表单的用户控件上的按钮单击事件【英文标题】:Button click event on a user control dynamically created to a WPF form 【发布时间】:2019-05-29 17:51:21 【问题描述】:

我在运行时根据对 XML 数据数据库的查询添加用户控件。所以,用户控件的数量是不同的。

此外,鉴于接收到的 XML 类型,我无法将用户控件绑定到从 XML 数据创建的列表,因为在某些情况下,我将根据这是新客户端还是现有客户端来拉取不同的字段。对于现有客户,只有 8 个字段。一个新客户需要 40 或 50 个字段。

我正在创建基于新客户端与现有客户端的两个用户控件之一。

我相信这是用户控件所需要的。

这里是代码sn-p。

public event RoutedEventHandler btnAddClient_Click;

private void OnButtonClick(object sender, RoutedEventArgs e)

    if(btnAddClient_Click !=null)
        
            btnAddClient_Click(this, new RoutedEventArgs());
        

public ucNewClient()

    InitializeComponent();

我需要知道如何在动态创建的用户控件和主窗体上设置点击事件。

任何帮助将不胜感激。

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

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

【问题讨论】:

在设计时和运行时创建控件可能会更好,只是显示或隐藏它? 【参考方案1】:

欢迎来到 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>

【讨论】:

以上是关于动态创建到 WPF 表单的用户控件上的按钮单击事件的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Powershell代码更改特定WPF列表框项的背景颜色?

通过WPF中的命令绑定使整个用户控件可单击

WPF C#为动态创建的按钮创建Click事件

用户单击 ASP.NET Web 表单上的按钮与计时器运行调用相同按钮单击事件的方法之间的区别?

弹出窗口 WPF 表单自定义控件内容

VBA for Access 2010:动态创建控件和链接事件处理程序