在我的C#应用程序中,我有两个ObservableCollection
属性:
public ObservableCollection<Material> Materials { get; init; } = new();
public ObservableCollection<string> MaterialNames
{
get
{
ObservableCollection<string> names = new();
foreach (Material material in Materials)
{
names.Add(material.Name);
}
return names;
}
}
字符串
第二个属性隐藏了第一个属性,从第一个列表中的对象返回Name
。WPF ListBox
绑定到第二个属性。我需要的是第二个列表在第一个列表中添加或删除成员时触发更新,以便ListBox
更新。现在,这不会发生。实现这一点的最简单的解决方案是什么?“连接”两个ObservableCollections的通知?
免责声明:我知道绑定到第一个属性并将DisplayMemberPath
设置为Name
更容易,但由于应用程序中的某些约束,我需要绑定到一个单独的属性。
2条答案
按热度按时间dgenwo3n1#
最简单的方法是使用一个不可变集合作为源,并在需要时替换整个集合。所有更改都必须通过替换不可变集合来完成。
字符串
你可以做一些事情,比如将一个列表的变化投射到另一个列表,只需要监听
CollectionChanged
并将这些变化复制到你的另一个集合。但是我发现很难准确地弄清楚发生了什么变化。所以我个人倾向于使用一个自定义列表,其中包含更多的信息事件,我可以用来将变化复制到一个ObservableCollection。如果你需要序列化这些数据,我建议你创建单独的“数据传输对象”(Data Transfer Objects,DTO),其中只包含序列化库可以处理的普通列表/数组。然后你可以从中创建你的UI模型。这样你就不会把UI问题和序列化问题混在一起。
但更好的解决方案几乎肯定是解决阻止您使用
DisplayMemberPath
的任何问题brgchamk2#
总的来说,我认为你的实现是错误的。ListBox应该绑定到Materials集合,但只显示Name Material属性。因此,MaterialNames集合是多余的。
但我认为实现你需要的绑定会很有趣。下面是我的实现。看看吧。
字符串