【问题标题】:WPF Observablecollection master detail scenarioWPF Observablecollection 主细节场景
【发布时间】:2011-01-02 15:11:41
【问题描述】:

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

我有模特

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 中的 Details 集合只是一个 Details 列表(不是 ObservableCollection),这很明显是为什么。

我在这里有什么选择?我已经尝试实现 INotifyPropertyChanged 但这似乎不起作用。我可以为 Details 设置另一个 ObservableCollection,但这意味着当 SelectedMaster 更改时我必须保持此集合同步(SelectedMaster 属性绑定到我的第一个列表框上的 SelectedItem。

希望这一切顺利。真的很想得到一些反馈。如果 WCF 可以像处理大师的集合一样将详细信息的集合作为可观察的集合返回,那将是理想的,但它似乎不像那样工作。

谢谢。

【问题讨论】:

    标签: wpf wcf observablecollection master-detail


    【解决方案1】:

    我不知道 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 你的答案肯定更干净;我想我会留下我的答案作为快速'n简单的选择,但这是我会这样做的方式:)
    【解决方案2】:

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

    我会将其设为ObservableCollection&lt;Detail&gt; 并将集合加载到Master 的构造函数中,例如...

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

    请记住,ObservableCollection&lt;T&gt;IEnumerable&lt;T&gt;List&lt;T&gt; 作为其构造函数中的参数。

    【讨论】:

    • 好的,我想我明白你的意思了。感谢您的回复。我认为我有点不清楚的是,我认为视图模型将是我认为我会使用诸如 observableCollection 之类的东西的唯一地方(因为它只需要帮助支持 UI)。这样做我现在正在更改我的模型以包含仅对 UI 真正必要的东西。这是正确的做法吗?
    • 查看我的答案,将MasterDetail 都包装起来,以实现更好的解耦,并避免将视图依赖项引入模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多