【问题标题】:Subscribing to PropertyChanged event in Window.xaml.cs在 Window.xaml.cs 中订阅 PropertyChanged 事件
【发布时间】:2012-09-12 10:42:20
【问题描述】:

我有一个要转换为实现 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));
            }
        }
    }

【问题讨论】:

  • 您能否详细说明问题。为什么要订阅 Window.xaml.cs 中的 PropertyChanged。

标签: c# .net wpf inotifypropertychanged


【解决方案1】:

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

public bool IsChecked
        {
            get { return isChecked; }

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

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

【讨论】:

  • 让我们澄清一下问题。你有几个模型,每个模型都有几个代表表格行的 LanguageCategory。并且您想知道任何 LanguageCategory 何时更改,而不管模型如何?
  • 我创建了以下似乎可行的方法:public static class ModelNotifer { public static event PropertyChangedEventHandler DataChanged;公共静态无效RaiseDataChanged(对象发件人,PropertyChangedEventArgs e){如果(DataChanged!= null){DataChanged(发件人,e); } } }
【解决方案2】:

您希望在选中 LanguageCategorys 之一时通知 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
}

【讨论】:

  • 你能用代理展示一些示例代码吗,我喜欢它的声音
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2011-02-05
  • 2011-12-11
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多