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

标签 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 集合绑定(bind)到 View 中的 ListView

我最大的疑问是模型中是否应该有 ObservableCollection。如果不是,什么是更好的方法?

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

我可以在 Codes 中有多个具有不同值的相同代码 - 例如:

Code a = new Code { value="test1", Code ="100" }
Code b = new Code { value="test2", Code ="100" }

这些值应该绑定(bind)到 View 中的 TestBoxes。

====编辑=====

可能是我暴露问题了。当我说不能创造更多时,我可能会导致一个错误的前提。我的意思是初始结构是使用数据库查询创建的,但在 UI 中会有复制代码和子代码的按钮...并将它们添加到相应的列表中。

例如:在用户界面中:

代码 A - 复制按钮

-> 子代码 A - 复制按钮

-> 子代码 B - 复制按钮

代码 B - 复制按钮

每次我点击复制按钮时,它都会复制结构(子代码或带有子代码的代码)。

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

我希望我说清楚了...对不起我的英语。

问候

最佳答案

你不需要 ObservableCollection<T>这仅在您在分配后从集合中添加或删除项目时才有用 - 您说您没有。 List<T>在 MVVM 中会很好。但是你仍然要记住实现 INotifyPropertyChanged 并提高 PropertyChangedList<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/

相关文章:

c# - 使用 fileHelpers 库的 CSV 中的列标题?

c# - DataTable 删除列并重新排序列

c# - 在 .NET 中有什么方法可以继承没有构造函数的类吗?

c# - 使用 Background Worker 时丢失 UI 功能

c# - 在接口(interface)中实现接口(interface)属性?

c# - InputPane 禁用隐藏 (Windows Phone 8.1)

c# - DataGrid.SelectedItems MVVM

c# - ObservableCollection<TabItems> 中的值未落在预期范围内

c# - MVVM - 用户控件相互通信的理想方式是什么

wpf - 使用 CollectionViewSource 的组的自定义排序逻辑