Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中绑定多个嵌套属性_C#_Wpf_Data Binding - Fatal编程技术网

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");
    }
}