Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewModel包含另一个ViewModel的集合_C#_Wpf_Mvvm - Fatal编程技术网

C# ViewModel包含另一个ViewModel的集合

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的实例吗?我可以想象这样的情况:我们有存储和存储架的集合,因此我们最终得到

在所有关于MVVM的教程中,我读到
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));