2012-09-12 57 views
2

我有一个DataTable转换为实现INotifyPropertyChanged的模型。订阅Window.xaml.cs中的PropertyChanged事件

这将绑定到一个带有复选框的列表框。当复选框被选中时,PropertyChanged事件触发。我想处理这个,因为我有一个绑定到DataTable的DataGrid。我想根据选中的项目过滤该DataTable。

我想订阅MainWindow.xaml.cs中的PropertyChange事件,但我不确定如何做到这一点,因为在我的模型的构造函数中注册处理程序时,如果我仅假设我只是创建X数量的处理程序需要一个?

以下是我有:

var categoryModel = ds.Tables[1].Rows.Cast<DataRow>() 
           .Select(x => x["Category"].ToString()) 
           .Distinct() 
           .Select(y => new LanguageCategory { CategoryName = y, IsChecked = true }); 

public class LanguageCategory : INotifyPropertyChanged 
    { 
     private string categoryName; 
     private bool isChecked; 
     public event PropertyChangedEventHandler PropertyChanged; 

     public string CategoryName 
     { 
      get { return categoryName; } 
      set 
      { 
       categoryName = value; 
       NotifyPropertyChanged("CategoryName"); 
      } 
     } 

     public bool IsChecked 
     { 
      get { return isChecked; } 

      set 
      { 
       isChecked = value; 
       NotifyPropertyChanged("IsChecked"); 
      } 
     } 


     private void NotifyPropertyChanged(string info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
+0

能否请您详细阐述该问题的更多。为什么要在Window.xaml.cs中订阅PropertyChanged? – ethicallogics

+0

我已更新问题 – Jon

回答

2

您希望在LanguageCategory S的一个检查通知的主窗口。 你有两种选择。

1)当你创建你的LanguageCategory的名单,订阅他们的每一个的PropertyChanged事件。您必须记得在重新创建列表时取消订阅。

2)创建在主窗口的回调方法,并在委托传递给它,当您创建的每个LanguageCatagory。当它的IsChecked改变时,LanguageCategory可以调用它。这与JesseJame的答案类似,但不涉及其他课程。 这个优于1的优点是当列表更改时不需要清理。 2

示例代码)

var categoryModel = ds.Tables[1].Rows.Cast<DataRow>() 
         .Select(x => x["Category"].ToString()) 
         .Distinct() 
         .Select(y => new LanguageCategory(OnChecked) { CategoryName = y, IsChecked = true }); 

public void OnChecked() 
{ 
    //reload list or whatever 
} 


public class LanguageCategory : INotifyPropertyChanged 
{ 
    private string _categoryName; 
    private bool _isChecked; 
    private Action _checkedCallback; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public LanguageCategory(Action checkedCallback) 
    { 
     _checkedCallback = checkedCallback; 
    } 

    public string CategoryName 
    { 
     get { return _categoryName; } 
     set 
     { 
      _categoryName = value; 
      NotifyPropertyChanged("CategoryName"); 
     } 
    } 

    public bool IsChecked 
    { 
     get { return _isChecked; } 

     set 
     { 
      _isChecked = value; 
      NotifyPropertyChanged("IsChecked"); 
      _checkedCallback(); 
     } 
    } 

    //snip rest of code 
} 
+0

您展示与委托一些示例代码,我喜欢它 – Jon

+0

的声音有没有和示例代码编辑。 – GazTheDestroyer

+0

非常感谢! – Jon

3

创建一个新类“通告”,将有公开活动,说DataChanged和公共方法提高DataChanged事件。然后,修改属性更改实施:

public bool IsChecked 
     { 
      get { return isChecked; } 

      set 
      { 
       isChecked = value; 
       NotifyPropertyChanged("IsChecked"); 
       Notifier.RaiseDataChanged(); 
      } 
     } 

订阅Notifier.DataChanged事件MainWindow.xaml

+0

让我们来澄清问题。你有几个模型,在每个模型中你有几个LanguageCategory代表一个表格行。你想知道什么时候改变了LanguageCategory,而不管模型是什么? – opewix

+0

我创建了下面这似乎工作:公共静态类ModelNotifer { 公共静态事件PropertyChangedEventHandler DataChanged; 公共静态无效RaiseDataChanged(对象发件人,PropertyChangedEventArgs E) { 如果(DataChanged!= NULL){ DataChanged(发件人,E); }} } 能 – Jon