首页 > 解决方案 > 如何在 WPF 中绑定多个嵌套属性

问题描述

这是我的问题,我有以下数据结构:

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

我想在主窗口中显示作业的全局状态摘要。

我首先尝试在 Jobs 列表上进行数据绑定,然后使用自定义 IValueConverter 来显示全局状态。问题:当作业状态更改时它不会刷新(因为它绑定到集合而不是状态)。

ProgressState="{Binding Jobs, Converter={StaticResource JobsToProgressState}, ElementName=MainWindow}"

所以我试图找到一个解决方案,我可以将作业的所有嵌套属性绑定到 IMultiValueConverter。我没有找到任何语法来完成这项工作。

有可能做这样的事情吗?

编辑:我想做类似的事情

ProgressState="{Binding Jobs[*].State, Converter={StaticResource JobsToProgressState}, ElementName=MainWindow}"

并在 JobsToProgressState 转换器中检索包含所有作业状态 ( StateEnum[] ) 的数组。

标签: c#wpfdata-binding

解决方案


问题是当记录发生更改OnPropertyChanged时不会触发。IList您需要将OnPropertyChangedup委托Job给您的Jobs-List。

这个粗略的实现会做你想做的事。

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

当您不再需要它们时,不要忘记取消连接您的活动注册。


推荐阅读