订阅Window.xaml.cs中的PropertyChanged事件

时间:2012-09-12 10:42:21

标签: c# .net wpf inotifypropertychanged

我有一个DataTable,我正在转换为实现INotifyPropertyChanged的模型。

这会绑定到一个带有复选框的列表框。选中该复选框后,将触发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));
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

创建一个新的类“Notifier”,它将具有公共事件,比如DataChanged,以及一个提出DataChanged事件的公共方法。然后修改属性更改的实现:

public bool IsChecked
        {
            get { return isChecked; }

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

订阅MainWindow.xaml中的Notifier.DataChanged事件

答案 1 :(得分:2)

您希望在选中其中一个LanguageCategory时通知MainWindow。 你有两个选择。

1)当您创建LanguageCategory的列表时,请订阅其每个PropertyChanged事件。您必须记住在重新创建列表时取消订阅它们。

2)在MainWindow中创建一个回调方法,并在创建每个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
}