WPF Observablecollection主细节场景

时间:2010-01-07 19:05:51

标签: wpf wcf observablecollection detail

对此的任何帮助都会很棒。

我有一个模特

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的集合一样,那将是理想的,但它似乎并不像那样工作。

感谢。

2 个答案:

答案 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>作为参数。