C# 如何在WPF中绑定多个嵌套属性
这是我的问题,我有以下数据结构:C# 如何在WPF中绑定多个嵌套属性,c#,wpf,data-binding,C#,Wpf,Data Binding,这是我的问题,我有以下数据结构: public class Job : INotifyPropertyChanged { public StateEnum State { get { return this.state; } private set { this.state = value; this.OnPropertyChanged(); } } } public class
public class Job : INotifyPropertyChanged {
public StateEnum State {
get { return this.state; }
private set {
this.state = value;
this.OnPropertyChanged();
}
}
}
public class MainWindow : Window, INotifyPropertyChanged
public List<Job> Jobs {
get { return this.jobs; }
private set {
this.jobs = value;
this.OnPropertyChanged();
}
}
}
因此,我试图找到一种解决方案,可以将作业的所有嵌套属性绑定到IMultiValueConverter。我没有找到任何语法来实现这一点
有可能做那样的事吗
编辑:
我想做一些像
ProgressState="{Binding Jobs[*].State, Converter={StaticResource JobsToProgressState}, ElementName=MainWindow}"
并检索包含JobsToProgressState转换器中所有作业状态(StateEnum[])的数组。问题是当
IList
的记录更改时,不会激发OnPropertyChanged
。您需要将作业
的OnPropertyChanged
委托给您的作业
-列表
这个粗略的实现可以满足您的需要
public class Job : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public StateEnum State {
get { return this.state; }
private set {
this.state = value;
this.OnPropertyChanged();
}
}
}
public class MainWindow : Window, INotifyPropertyChanged
public List<Job> Jobs {
get { return this.jobs; }
private set {
this.jobs = value;
foreach(var job in this.jobs)
{
job.PropertyChanged += job_PropertyChanged;
}
}
}
private void job_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged("Jobs");
}
}
公共类作业:INotifyPropertyChanged{
公共事件属性更改事件处理程序属性更改;
公共状态枚举状态{
获取{返回this.state;}
专用设备{
this.state=值;
this.OnPropertyChanged();
}
}
}
公共类主窗口:窗口,INotifyPropertyChanged
公开列出工作{
获取{返回this.jobs;}
专用设备{
这就是就业=价值;
foreach(此.jobs中的var job)
{
job.PropertyChanged+=job\u PropertyChanged;
}
}
}
私有无效作业\u PropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
本协议项下的不动产变更(“工作”);
}
}
当您不再需要事件注册时,不要忘记取消它们。状态和作业是字段,而不是属性。数据绑定仅适用于公共属性。请在此处发布准确代码的相关部分以避免混淆。正如@Clemens提到的,您必须将字段定义为属性,并且,您应该实现INotifyPropertyChanged interfaceSorry,我将在示例中明确说明。但是这些都是公共依赖属性。如果作业集合正在更改,则应将作业集合实现为
可观察集合
,而不是列表
。作业的状态正在更改。不会“抛出”方法或事件。调用一个方法,并引发(或有时激发)一个事件。
public class Job : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public StateEnum State {
get { return this.state; }
private set {
this.state = value;
this.OnPropertyChanged();
}
}
}
public class MainWindow : Window, INotifyPropertyChanged
public List<Job> Jobs {
get { return this.jobs; }
private set {
this.jobs = value;
foreach(var job in this.jobs)
{
job.PropertyChanged += job_PropertyChanged;
}
}
}
private void job_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.OnPropertyChanged("Jobs");
}
}