Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# MVVM从其他ViewModel对ViewModel执行命令_C#_Wpf_Mvvm_Icommand - Fatal编程技术网

C# MVVM从其他ViewModel对ViewModel执行命令

C# MVVM从其他ViewModel对ViewModel执行命令,c#,wpf,mvvm,icommand,C#,Wpf,Mvvm,Icommand,我现在为一项简单的任务奋斗了大约14天:在数据库中,我有硬件类别的定义。例如: 硬盘驱动器 内部的 外部的 闪光 此列表在数据库中定义如下: [ID - ParrentID - Name] : 1 - 0 - HDD, 2 - 1 - Internal, 3 - 1 - External, 4 - 1 - Flash. 通过实体框架,我将这些行放入我的应用程序中。然后从这个平面数据创建结构化对象,它是我的数据模型。该模型定义如下: public class Cate

我现在为一项简单的任务奋斗了大约14天:在数据库中,我有硬件类别的定义。例如:

  • 硬盘驱动器
    • 内部的
    • 外部的
    • 闪光
  • 此列表在数据库中定义如下:

        [ID - ParrentID - Name] : 1 - 0 - HDD, 2 - 1 - Internal, 3 - 1 - External, 4 - 1 - Flash.        
    
    通过实体框架,我将这些行放入我的应用程序中。然后从这个平面数据创建结构化对象,它是我的数据模型。该模型定义如下:

    public class Category
    {
       private int _id = -1;
       private string _name = "";
       private List<Category> _subCategories = null;
    // property getters and setters, constructors, and bool HasSubCategories
    }  
    

    使用MVVM并尝试在视图和ViewModel之间或ViewModels之间进行通信时,发布者/订阅者设置工作正常,或者使用类似MVVMLight或Prism的消息传递范例。我在MVVM Light的消息设置上发布了一个答案

    在消息中,您可以发送一个对象,该对象包含您希望在视图模型之间来回发送的任何数据


    我强烈建议在使用mvvm时使用一个框架,这样会更容易。是一个链接,指向通过比较一些主要框架得出的答案。

    我不确定我是否看到了问题所在。您有一个子类别树,当选择其中一个时,相应的
    subcategory视图模型
    会在主
    HWDocumentViewModel
    上将自身设置为
    SelectedCategory
    。这似乎是一个合理的方法

    那么为什么需要调用命令呢?为什么不能在
    HWDocumentViewModel
    中加载新列表,以响应其
    SelectedCategory
    属性的更改(即在setter中)

    如果确实必须使用命令来调用加载,则只需在每个
    子类别viewmodel
    中保留对主
    HWDocumentViewModel
    的引用,并使用简单的以下命令调用该命令:

    _mainViewModel.LoadCategoryCommand.Execute();
    

    你能添加你的treeview xaml吗。你的问题让我对+1问题感到困惑。我在消息传递方面做了很多令人印象深刻的事情(比如动画等等),所以性能应该很好。所以,你说我需要实现一个完整的范例来获得一个基本的功能,比如从类别列表中选择类别项?或者我需要利用一个完整的框架来让它工作?消息传递和框架用于跨视图模型通信,或者用于从视图到视图模型的通信,而不是简单的绑定。从MVVM的角度来看,您可以只获取您想要使用的部分并实现它们,但是使用已经为您创建的消息传递范例,而不是创建您自己的发布者/订阅者模型并实现它们,这是非常有意义的。如果您不想实现整个框架,您不需要实现整个框架,但是,按照我的理解,通过实现一个框架,您可能会节省大量时间—框架是实现更复杂的东西的一种方式。但在我看来,在我的场景中使用它就像拿一辆坦克去杀一只蚂蚁;)。我将更仔细地看一看MVVM轻型框架,它似乎功能强大——感谢tipThis,这就是我想要的解决方案。但我有点困惑——我采用的方法,你是说它是合理的——即在主视图模型上有一个静态属性,并由其他视图模型设置。这是一种真正的MVVM方式吗?不是静态的,不是。但是在我看来,一个普通的属性很好。你可以使用事件来解耦视图模型,但这对我来说似乎有些过分。
    _mainViewModel.LoadCategoryCommand.Execute();