c# - 如何在 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[] ) 的数组。
解决方案
问题是当记录发生更改OnPropertyChanged
时不会触发。IList
您需要将OnPropertyChanged
up委托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");
}
}
当您不再需要它们时,不要忘记取消连接您的活动注册。
推荐阅读
- javascript - 在自定义元素中使用类方法作为 onclick 函数
- python-3.x - 将选择限制为用户属性
- c++ - 非限定名称何时/为什么/如何在依赖库中查找?
- node.js - 使用 Angular 从 MongoDB 中搜索文档
- html - 如何从 Wordpress 获取视频(iframe) - WPGraphQL 无头 CMS
- python - 使用 Python 和 Pandas 从 Oracle 获取数据的性能问题
- c - select() 在未连接的套接字上返回 1(不一致)
- websocket - Cloudflare 阻止 websocket 连接
- javascript - 在画布上绘制三角形,当所有 3 个边都给定时,但将其移动到中间并旋转它(Javascript)
- html - Android Webview 视频 - net::ERR_BLOCKED_BY_RESPONSE