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

C# 订阅Window.xaml.cs中的PropertyChanged事件,c#,.net,wpf,inotifypropertychanged,C#,.net,Wpf,Inotifypropertychanged,我有一个数据表,我正在转换为一个实现INotifyPropertyChanged的模型 这将绑定到一个带有复选框的列表框。选中该复选框时,将触发PropertyChanged事件。我想处理这个问题,因为我有一个绑定到DataTable的DataGrid。我想根据选中的项目筛选该数据表 我想在MainWindow.xaml.cs中订阅PropertyChange事件,但是我不确定该怎么做,因为在我的模型的构造函数中注册一个处理程序会创建X个处理程序,而我假设我只需要一个 以下是我所拥有的: var

我有一个数据表,我正在转换为一个实现INotifyPropertyChanged的模型

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

我想在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));
            }
        }
    }
var categoryModel=ds.Tables[1].Rows.Cast()
.Select(x=>x[“类别”].ToString()
.Distinct()
.Select(y=>newlanguagecategory{CategoryName=y,IsChecked=true});
公共类语言类别:INotifyPropertyChanged
{
私有字符串categoryName;
私人住宅被检查;
公共事件属性更改事件处理程序属性更改;
公共字符串类别名称
{
获取{return categoryName;}
设置
{
categoryName=值;
NotifyPropertyChanged(“类别名称”);
}
}
公共场所被检查
{
获取{return isChecked;}
设置
{
isChecked=值;
NotifyPropertyChanged(“已检查”);
}
}
私有void NotifyPropertyChanged(字符串信息)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(信息));
}
}
}
创建一个新类“Notifier”,该类将包含公共事件(如DataChanged)和引发DataChanged事件的公共方法。然后修改属性更改实现:

public bool IsChecked
        {
            get { return isChecked; }

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

订阅MainWindow.xaml中的Notifier.DataChanged事件您希望在选中某个
语言类别时通知MainWindow。
你有两个选择

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

2) 在MainWindow中创建一个回调方法,并在创建每个LanguageCatagory时向其传递一个委托。LanguageCategory可以在其IsChecked发生更改时调用它。这与JesseJame的答案相似,但不涉及其他课程。 与1相比,此选项的优点是当列表更改时不需要进行清理

示例代码(2)

var categoryModel=ds.Tables[1].Rows.Cast()
.Select(x=>x[“类别”].ToString()
.Distinct()
.Select(y=>newlanguagecategory(OnChecked){CategoryName=y,IsChecked=true});
已检查的公共无效()
{
//重新加载列表或其他什么
}
公共类语言类别:INotifyPropertyChanged
{
私有字符串_categoryName;
检查私人住宅;
私人行动检查回调;
公共事件属性更改事件处理程序属性更改;
公共语言类别(Action checkedCallback)
{
_checkedCallback=checkedCallback;
}
公共字符串类别名称
{
获取{return\u categoryName;}
设置
{
_categoryName=值;
NotifyPropertyChanged(“类别名称”);
}
}
公共场所被检查
{
获取{return\u已检查;}
设置
{
_isChecked=值;
NotifyPropertyChanged(“已检查”);
_checkedCallback();
}
}
//剪掉剩下的代码
}

让我们澄清问题。您有几个模型,每个模型中都有几个LanguageCategory,它表示一个表行。你想知道什么时候改变了LanguageCategory中的任何一个,而不考虑模型吗?我已经创建了下面的代码,看起来很有效:public static类ModelNotifer{public static event property changedeventhandler DataChanged;public static void raisedatchanged(object sender,property changedeventargs e){if(DataChanged!=null){DataChanged(sender,e);}}}}}你能详细说明一下这个问题吗?为什么你想订阅Window.xaml.cs中的PropertyChanged。你能给我看一些委托的示例代码吗?我喜欢它的声音
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
}