我正在努力争取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代码中完成这些更改。
我希望我能让自己明白......对不起我的英语。
此致
答案 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中。