gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:08:53 24 4
gpt4 key购买 nike

我正在为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com