2

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

我有一个模型

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 可以像处理大师的集合一样将详细信息的集合作为可观察的集合返回,那将是理想的,但它似乎不像那样工作。

谢谢。

4

2 回答 2

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;
    }
于 2010-01-07T19:14:52.363 回答
1

没错,问题在于 Details 属性没有将更改通知回视图,因为它只是一个 Detail 对象数组...

我会把它做成一个ObservableCollection<Detail>并在 's 的构造函数中加载集合Master,比如......

public Master(Detail[] details)
{
    Details = new ObservableCollection<Detail>(details);
}

请记住,在其构造ObservableCollection<T>函数中将IEnumerable<T>orList<T>作为参数。

于 2010-01-07T19:16:18.790 回答