有没有一种在WPF中一次向多个控件添加事件的快速方法?

时间:2013-06-25 15:03:26

标签: c# wpf xaml controls

我在页面上有400多个文本框。该页面是纸质表格的精确复制品。用户将编辑所有字段,然后将数据保存到DB。数据将从SQL DB下拉到DataTable中。

我打算通过相同的DataTable或通过批量更新来保存数据。不是100%。但是,我需要访问该数据。也许我没有做到最好的下一个最好的部分,如果我不是,如果我被告知更好的方式,我会很感激。

当DataTable获取数据时,我将每个字段分配到适当的控件中。以下是如何添加数据的示例。

foreach (DataRow CDR in ClaimDataTable.Rows){
    if (CDR["BoxNumber"].ToString() == "1.1")
        this.Box1_1.Text = CDR["DataValue"].ToString();
    if (CDR["BoxNumber"].ToString() == "1.2")
        this.Box1_2.Text = CDR["DataValue"].ToString();
    if (CDR["BoxNumber"].ToString() == "1.3")
        this.Box1_3.Text = CDR["DataValue"].ToString();

我写了一些代码来自动创建代码。所以我没有手动编写所有400多行。

我在想的是,我可以为每个TextBox添加一个LostFocus事件。然后当控件失去焦点时,我会创建一个带有框名和框值的类。将其添加到列表中,当它们准备好保存时,只需遍历列表并使用BoxNumber和框数据进行批量更新。

那可行吗?或者有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

  1. 查看event routing
  2. 您不应该创建和访问单个文本框,而是让框架通过datatemplating集合创建它们,您的上述代码非常恐怖。

答案 1 :(得分:2)

  

当DataTable获取数据时,我将每个字段分配到   适当的控制。

WPF是数据绑定,并且通常不会像您提到的那样加载控件。为什么代码没有绑定到每个控件到属于INotifyPropertyChanged的属性?

  1. 让页面的DataContext(DC)指向一个符合InotifyPropertyChanged接口的实例化类。以这种方式设置DC将允许页面上的所有控件默认使用其datacontext。
  2. 在要为DC实例化的类中,创建一个成员属性,该属性在使用INotifyPropertyChanged系统设置值时调用PropertyChanged。
  3. 将每个TextBox Text属性绑定到类上的该属性。
  4. 然后,每个需要该值的控件将在设置后自动显示它,如本例所示。

    <TextBlock Name="tbHeader"
               Text="{Binding CDRData}" />
    

    然后只需要将值写入名为CDRData的属性一次,并且绑定的所有文本框都将获得该值。