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