带集合的MVVM模型。在模型中使用或不使用observablecollection

时间:2014-02-24 00:55:38

标签: c# wpf mvvm binding mvvm-light

我正在努力争取MVVM的一个方面,我希望有人可以启发我。

我的情况是这样的: 像这样的模型:

public class Codes
{
    public string Code { get; set; }
    public string Value { get; set; }
    public ObservableCollection<SubCoddes> SubCodes { get; set; }
}

具有以下内容的ViewModel:

public ObservableCollection<Codes> Codes { get; set; }

Codes集合绑定到视图中的ListView

我很怀疑的是模型中是否应该有ObservableCollection。如果没有,什么是更好的方法?

初始化应用程序时,{1}}和Codes都由MS SQLServer数据库中的查询填充...并且没有创建新选项的选项。它们只能重复使用。

我可以在SubCodes个多个相等代码中使用不同的值 - 例如:

Codes

这些值应绑定到视图中的Code a = new Code { value="test1", Code ="100" } Code b = new Code { value="test2", Code ="100" } es。

==== EDIT =====

也许我错误地暴露了这个问题。当我说无法创造更多时,我可能会导致错误的预备。我的意思是初始结构是使用数据库查询创建的,但在UI中会有按钮来复制代码和子代码......并且会将这些按钮添加到相应的列表中。

Ex:在用户界面中:

代码A - 重复按钮

- &GT;子代码A - 重复按钮

- &GT;子代码B - 重复按钮

代码B - 重复按钮

每当我点击一个重复的按钮时,它就会复制结构(子代码或带子代码的代码)。

必须在bservableCollection代码中完成这些更改。

我希望我能让自己明白......对不起我的英语。

此致

2 个答案:

答案 0 :(得分:3)

您不需要ObservableCollection<T>仅在分配后从集合中添加或删除项目时才有用 - 您说不是。一个List<T>在MVVM中很好。但是,您仍然需要记住实施INotifyPropertyChanged并在分配PropertyChanged时提升List<T> - 或者您指定的任何内容都希望绑定重新读取来源。

e.g。你应该:

private List<Code> codes;
public List<Codes> Codes 
{ 
    get {return codes;}
    set 
    {
        codes = value;
        NotifyPropertyChanged("Codes");
    }
}

private void NotifyPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

这同样适用于您的嵌套集合子代码,即Codes也应该实现接口,而SubCodes的setter应该引发事件。此外,如果您要在运行时修改Code的属性,并且希望在UI中反映出来,Code上的属性也应该引发事件。您绑定到的任何类都应该始终实现接口,即使各个属性不引发事件because binding to a class that does not implement the interface creates memory leaks.(除非该属性是DependencyProperty,除非您正在创作自己的控件,否则它不应该是,或者绑定模式是OneTime)。

答案 1 :(得分:0)

我认为MVVM的方式是在Model中拥有实体/数据模型,并在ViewModel中对它进行所有的tweek和修改,以便它可以将它绑定到View。假设您正在使用可观察集合来检查用户是否修改了某些文本框,那么它们应该在ViewModel中。