【问题标题】:How to bind observebale collection to collections in the model如何将observebale集合绑定到模型中的集合
【发布时间】:2017-07-11 20:26:21
【问题描述】:

基本上这是一个与this one 非常相似的问题,最大的不同是我不能轻易“在模型中使用可观察的集合”;一个很好的例子是字典的 keycollection。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

public class Data
{
    private Dictionary<String, String> _randomData;
    public Data()
    {
        _randomData = new Dictionary<String, String>();
    }

    public ICollection<string> RandomDataKeys {
        get {
            return _randomData.Keys;
        }
    }

    public void AddElement(string k, string v) {
        _randomData[k] = v;
    }
}


public class DataViewModel
{
    private Data _data;

    public DataViewModel(Data data)
    {
        _data = data;
        RandomData = new ObservableCollection<String>(_data.RandomDataKeys);
        //obviously above wouldn't work, since it just copies the keys.
    }

    public ObservableCollection<String> RandomData {get; set;}
}

现在这里的常用方法是什么?备份是更改“添加”函数以告诉视图模型添加了新项目(但这需要模型具有有关视图模型的信息,显式调用视图模型上的函数以告诉视图模型保留模型的数据,这感觉很浪费而且很慢)。

【问题讨论】:

  • 当您添加项目时,在您的模型中引发一个事件并在您的视图模型中订阅它。
  • 这一切都取决于真正的代码实际上是什么样的,所以这个问题太宽泛了。唯一的共同点是,当底层数据发生变化时,您将需要某种机制来获得通知。显然,对于字典或其相关集合本身,这不会自动发生;您需要首先拥有进行任何修改的代码,然后更改 那个 代码以传递适当的通知。完成后,您可以直接向 WPF 公开数据和通知,或者通过例如调解。 ObservableCollection&lt;T&gt;.

标签: c# wpf mvvm data-binding


【解决方案1】:

问题是,当你这样做 RandomData = new ObservableCollection&lt;String&gt;(_data.RandomDataKeys); 时,你基本上创建了一个新的集合实例。因此,当您更新 _data.RandomDataKeys 时,此更改不会反映在您的可观察集合中。 请阅读this 最好的方法是在你的 Data 类中使用 ObservableCollection,但如果你不想这样做,你可以改变你的

public ObservableCollection<String> RandomData {get; set;}

public ObservableCollection<String> RandomData 
{    
    get { return new ObservableCollection(_data.RandomDataKeys); }
}

但是这绝对是不是一个好主意,每次都创建新的集合。 所以你可以尝试在你的 Data 类中实现 INotifyPropertyChanged 接口并直接绑定到你的_data.RandomDataKeys

【讨论】:

  • 我在这里可能想多了:但是 mv(c)vm 范式背后的核心并不是模型基本上只是一个包含数据的类。尽可能少的逻辑? - 从这里延伸,它不应该是一个完整的黑盒,如果视图的要求发生变化就不必更新吗?
  • @paul23,好吧,我说过 mvvm 并不要求您实际做某事,这只是解决方案设计的常见模式。而且你不应该严格遵循 mvvm 只遵循 mvvm。模型是某种抽象的东西,它很容易是数据类(DTO/业务/数据实体)以及您项目的业务逻辑。并且模型,如果是数据,必须始终包含一个通知事件,当数据更改并且 VM 可以检测到该事件时触发(模型甚至不知道它的事件正在 VM 中使用)。请看this方案
  • @paul23 我是 asp.net mvc 程序员,在 WPF/MVVM 方面没有那么丰富的经验,但是当我以前,我只是创建了某种 BaseNotifyingModel,它实现了 INotifyPropertyChanged 接口并使用了类,继承自 Window/Page/Componen 的 VM 内的基类。而且我认为没有必要为存储在“模型”中的任何数据实体/DTO/等创建单独的 VM 类,只要我不需要创建大型 VM 类。
猜你喜欢
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2016-05-03
  • 2014-05-03
  • 1970-01-01
  • 2011-02-22
  • 2018-10-25
相关资源
最近更新 更多