2

我有一个要转换为实现 INotifyPropertyChanged 的​​模型的 DataTable。

这将绑定到一个带有复选框的列表框。当复选框被选中时,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));
            }
        }
    }
4

2 回答 2

3

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

public bool IsChecked
        {
            get { return isChecked; }

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

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

于 2012-09-12T10:51:30.530 回答
2

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

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

2) 在 MainWindow 中创建一个回调方法,并在创建每个 LanguageCatagory 时将委托传递给它。LanguageCategory 可以在其 IsChecked 更改时调用它。这类似于 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
}
于 2012-09-12T11:29:38.683 回答