2012-09-12 86 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