gpt4 book ai didi

WPF/MVVM : Delegating a domain Model collection to a ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:24:45 25 4
gpt4 key购买 nike

域模型集合(通常是 List 或 IEnumerable)是 委托(delegate) 到 View 模型。

这意味着我的 CustomerViewModel 有一个 List 或 IEnumerable 类型的订单集合。

绑定(bind)控件无法识别列表中的任何更改。但是使用 ObservableCollection 就是这样。

这是 MVVM 设计模式中的一个问题。

你如何应对?

更新 :我如何做的示例:

 public class SchoolclassViewModel : ViewModelBase
{
private Schoolclass _schoolclass;
private ObservableCollection<PupilViewModel> _pupils = new ObservableCollection<PupilViewModel>();

public SchoolclassViewModel(Schoolclass schoolclass)
{
_schoolclass = schoolclass;
_schoolclass.Pupils = new List<Pupil>();

foreach (var p in schoolclass.Pupils)
Pupils.Add(new PupilViewModel(p));
}

public Schoolclass GetSchoolclass
{
get { return _schoolclass; }
}

public int ID { get; set; }

public string SchoolclassName
{
get { return _schoolclass.SchoolclassName;}
set
{
if(_schoolclass.SchoolclassName != value)
{
_schoolclass.SchoolclassName = value;
this.RaisePropertyChanged("SchoolclassName");
}

}
}

public ObservableCollection<PupilViewModel> Pupils
{
get{ return _pupils;}
set
{
_pupils = value;
this.RaisePropertyChanged("Pupils");
}
}
}

最佳答案

我不按照你描述的方式来处理这个问题。

如果我需要出示 Foo对象及其相关Bar View 中的对象,FooViewModel一般会实现 Bars ObservableCollection<BarViewModel> 类型的属性.

请注意,这与基础 Foo 是否无关。类有 Bars IEnumerable<Bar> 类型的属性. Foo类可能不会。应用程序甚至可能不需要遍历所有 Bar Foo 的对象,但在 UI 中除外。

编辑

当我的 View 是应用程序对象模型的简单表示时,我的操作几乎与您在示例中所做的一样。我的构造函数中的代码通常更紧凑:

_Bars = new ObservableCollection<BarViewModel>(
_Foo.Bars.Select(x => new BarViewModel(x)));

但这本质上是一样的。

但这假设 Foo实际上暴露了 Bars属性(property)。可能不会。或者也许只有一些 Bar对象应该出现在 View 中。或者也许它们应该与其他对象混合在一起,而 FooViewModel应该公开一个 CompositeCollection某种。

我要说的是 View 模型是 View 的模型。这不一定与底层对象模型直接对应。

举一个简单的例子:我的程序可以通过将项目拖放到五个不同的 ListBox 中,为用户提供一种将项目放入五个不同类别的方法。控制。最终,这样做会设置 Category Item 上的属性(property)目的。我的 View 模型将包含 CategoryViewModel 的集合对象,每个对象都具有 ObservableCollection<ItemViewModel> 类型的属性,因此在集合之间来回拖动项目很容易实现。

问题是,甚至可能没有 Category应用程序对象模型中的类,更不用说 Category 的集合了对象。 Item.Category可能只是 string 类型的属性. CategoryViewModel没有镜像应用程序的对象模型。它的存在只是为了支持 UI 中的 View 。

关于WPF/MVVM : Delegating a domain Model collection to a ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2906940/

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