我正在为 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
集合绑定(bind)到 View 中的 ListView
。
我最大的疑问是模型中是否应该有 ObservableCollection。如果不是,什么是更好的方法?
当应用程序初始化时,Codes
和 SubCodes
都由 MS SQLServer 数据库中的查询填充...并且没有创建新代码的选项。它们只能重复使用。
我可以在 Codes
中有多个具有不同值的相同代码 - 例如:
Code a = new Code { value="test1", Code ="100" }
Code b = new Code { value="test2", Code ="100" }
这些值应该绑定(bind)到 View 中的 TestBox
es。
====编辑=====
可能是我暴露问题了。当我说不能创造更多时,我可能会导致一个错误的前提。我的意思是初始结构是使用数据库查询创建的,但在 UI 中会有复制代码和子代码的按钮...并将它们添加到相应的列表中。
例如:在用户界面中:
代码 A - 复制按钮
-> 子代码 A - 复制按钮
-> 子代码 B - 复制按钮
代码 B - 复制按钮
每次我点击复制按钮时,它都会复制结构(子代码或带有子代码的代码)。
这些更改必须在 bservableCollection 代码中完成。
我希望我说清楚了...对不起我的英语。
问候
最佳答案
你不需要 ObservableCollection<T>
这仅在您在分配后从集合中添加或删除项目时才有用 - 您说您没有。 List<T>
在 MVVM 中会很好。但是你仍然要记住实现 INotifyPropertyChanged
并提高 PropertyChanged
当List<T>
已分配 - 或您分配的任何您希望绑定(bind)重新读取源代码的内容。
例如你应该:
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
还应该实现接口(interface),子代码的 setter 应该引发事件。此外,如果您要修改 Code
的属性,并且您希望在 UI 中反射(reflect) Code
上的属性也应该引发事件。此外,您绑定(bind)的任何类都应始终实现该接口(interface),即使各个属性不引发事件,because binding to a class that does not implement the interface creates memory leaks. (除非 Property 是 DependencyProperty,除非您正在编写自己的控件,否则它不应该是 DependencyProperty,或者 Binding Mode 是 OneTime)。
关于c# - 带集合的 MVVM 模型。在模型中使用或不使用 observablecollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976979/