C# ViewModel包含另一个ViewModel的集合
在所有关于MVVM的教程中,我读到C# ViewModel包含另一个ViewModel的集合,c#,wpf,mvvm,C#,Wpf,Mvvm,在所有关于MVVM的教程中,我读到View不应该知道Model,因此引入了ViewModel层 如果在这样的情况下:我们有货架,其中包含包装: namespace Storage.Model { class Pack { public string Name { get; set; } } } 就像我在上面的代码注释中提到的,一个ViewModel可以创建另一个ViewModel的实例吗?我可以想象这样的情况:我们有存储和存储架的集合,因此我们最终得到
View
不应该知道Model
,因此引入了ViewModel
层
如果在这样的情况下:我们有货架
,其中包含包装
:
namespace Storage.Model
{
class Pack
{
public string Name { get; set; }
}
}
就像我在上面的代码注释中提到的,一个ViewModel可以创建另一个ViewModel的实例吗?我可以想象这样的情况:我们有
存储
和存储架的集合
,因此我们最终得到了对ModelView的级联引用:存储视图模型
包含可观察集合
,它包含可观察集合
的集合
该解决方案的另一个问题是,如何参考Pack
类填充新引入的PackViewModel
?我们必须以某种方式将唯一标识符传递给PackViewModel
实例
我不想隐瞒这个问题与我的另一个问题有关
就像我在上面的代码注释中提到的,一个ViewModel可以创建另一个ViewModel的实例吗
对。在本例中,PackViewModel
只是Pack
的包装器。例如,当您不想直接公开或绑定到模型类型时,或者当模型类型没有实现INotifyPropertyChanged
接口时,通常会使用这样的包装器
这很好。你最终会得到更多的类,但每个类都有自己的责任。例如,您可以使用特定于UI的属性扩展包装器类,即视图绑定到的对象属性
该解决方案的另一个问题是,如何引用Pack
类填充新引入的PackViewModel?我们必须以某种方式将唯一标识符传递给PackViewModel
实例
您可以在创建包装器类时将包装器类与包装对象一起注入:
class PackViewModel
{
private readonly Pack _pack;
public PackViewModel(Pack pack)
{
_pack = pack;
}
public string Name
{
get { return _pack.Name; }
}
}
给定从某种存储库或服务接收的Pack
对象集合,您可以轻松创建包装器对象,例如:
var repo = PackRepository();
var packs = repo.GetPacks();
var wrapperObjects = packs.Select(pack => new PackViewModel(pack));
你为什么无缘无故地让生活变得复杂?没有人说过视图模型不应该使用模型层中的类。您的PackViewModel是多余的。有一个
可观察的收集是绝对可以的。很抱歉问了一些明显的问题。我正在学习MVVM,并尝试了解如何解决架构问题。我知道我可以将Pack
对象注入PackViewModel
。问题是如何做到这一点,因为只有Shelf ViewModel
知道预期的集合,因此必须通知PackViewModel
。所以我需要他们之间的沟通。我已经找到了解决方法:。总结一下我的MVVM困境。MVVM(C#+WPF)没有为这种关系提供本机解决方案,我们必须自己解决它,因此框架MVVM Light、Calibre和他们的:ViewModelLocator、Messenger.Default等。无论如何,感谢您的时间。特别是我的问题已经被否决了。
// DataContext for Pack
namespace Storage.ViewModel
{
class PackViewModel
{
private Pack pack;
public string Name
{
get{ return pack.Name; }
set{ ... }
}
public PackViewModel(int id)
{
// How to populate reference to Pack instance?
pack = (new PackRepository()).getById(id)
}
}
}
class PackViewModel
{
private readonly Pack _pack;
public PackViewModel(Pack pack)
{
_pack = pack;
}
public string Name
{
get { return _pack.Name; }
}
}
var repo = PackRepository();
var packs = repo.GetPacks();
var wrapperObjects = packs.Select(pack => new PackViewModel(pack));