对此的任何帮助都会很棒。
我有一个模特
public class Master
{
...
public Detail[] Details {get; set;}
}
我从WCF服务填充我的视图模型,该服务返回我的Master对象集合。我已经将服务引用配置为返回observablecollection,因此我可以在我的视图模型中轻松使用它。
我的视图模型有
public ObservableCollection<Master> Masters {get; set;}
public Master SelectedMaster {get; set;}
在我看来,我有2个列表框 - 一个绑定到我的Masters属性,另一个绑定到SelectedMaster.Details。
除了添加尝试向SelectedMaster添加新细节之外,这一切都很好。
SelectedMaster中的详细信息集合只是一个详细信息列表(不是ObservableCollection),这显然是原因。
我有什么选择?我尝试过实现INotifyPropertyChanged,但似乎没有用。我可以为Details提供另一个ObservableCollection,但这意味着我必须在SelectedMaster更改时保持此集合同步(SelectedMaster属性绑定到我的第一个列表框中的SelectedItem。
希望这可以实现。真的很喜欢一些反馈。如果WCF可以将详细信息的集合作为一个observablecollection返回,就像它对Masters的集合一样,那将是理想的,但它似乎并不像那样工作。
感谢。
答案 0 :(得分:2)
我不知道WCF是否可以配置为将嵌套集合作为其他类型而不是简单数组返回,但我会尝试给出WPF透视图。
这里没有魔力,一个简单的数组不会实现任何类型的更改通知;你只需将它包装在某种支持视图的集合中,例如ObservableCollection
。
包装所有内容并仅与包装的集合进行交互,例如:
public class MasterWrapper
{
...
public MasterWrapper(Master master)
{
this.Details = new ObservableCollection<Detail>();
this.Master = master;
foreach (var detail in Master.Details)
this.Details.Add(detail);
}
...
public static ObservableCollection<MasterWrapper> GetMasters()
{
ObservableCollection<MasterWrapper> results =
new ObservableCollection<MasterWrapper>();
List<Master> modelMasters = null; // Populate this from the service.
foreach (var m in modelMasters)
results.Add(new MasterWrapper(m));
return results;
}
答案 1 :(得分:1)
你是对的,问题是Details属性没有通知回View,因为它只是一个Detail对象数组......
我会将它设为ObservableCollection<Detail>
并在Master
的构造函数中加载集合,就像......
public Master(Detail[] details)
{
Details = new ObservableCollection<Detail>(details);
}
请记住ObservableCollection<T>
在其构造函数中将IEnumerable<T>
或List<T>
作为参数。