加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MVVM从其他ViewModel对ViewModel执行命令

发布时间:2020-12-15 08:21:16 所属栏目:百科 来源:网络整理
导读:我现在用一个简单的任务苦苦挣扎了大约14天:在数据库中,我有硬件类别的定义.例如 : 硬盘 内部 外部 Flash 此列表在数据库中定义如下: [ID - ParrentID - Name] : 1 - 0 - HDD,2 - 1 - Internal,3 - 1 - External,4 - 1 - Flash. 通过实体框架,我将这些行
我现在用一个简单的任务苦苦挣扎了大约14天:在数据库中,我有硬件类别的定义.例如 :

>硬盘

>内部
>外部
> Flash

此列表在数据库中定义如下:

[ID - ParrentID - Name] : 1 - 0 - HDD,2 - 1 - Internal,3 - 1 - External,4 - 1 - Flash.

通过实体框架,我将这些行放入我的应用程序中.从这个平面数据我然后创建结构化对象,这是我的DataModel.该模型定义如下:

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

现在,从这些我创建名为SubCategoryViewModel的ViewModel绑定到我的TreeView.因此,我可以在树视图中查看我的类别,并使用我定义和维护的层次结构.这很好用.在SubCategoryViewModel中,为MouseDoubleClick定义了一个通过附加行为的命令,该命令也绑定到TreeView.因此,当用户双击Item时,在SubViewCategoryModel中定义的方法将执行特定的代码. SubCategoryViewModel列表嵌套在HWDocumentViewModel中,这是我窗口的主ViewModel.
我现在需要的是显而易见的:当用户双击TreeView中的项目时,我需要从数据库加载项目并在ListView中显示它们.我的意见是,在HWDocumentViewModel中,我需要定义一个Items集合,并相应地将它们加载到ListView中的选定类别.但是,我不知道如何从SubCategoryViewModel对HWDocumentViewModel执行方法.因为:TreeView绑定到SubCategoryViewModel项的列表,因此当发生DoubleClick时,将执行SubCategoryViewModel上的方法.我正在寻找一种方法,如何在主ViewModel(HWDocumentViewModel)上执行方法.

我试过这种方法:
我在HWDocumentViewModel上创建了一个属性:public static SubCategoryViewModel SelectedCategory.当双击发生时,我将此属性设置为SubCategoryViewModel.所以,在这个属性中是object,它执行了doubleclick事件委托.太棒了,现在我在HWDocumentView模型中有一个用户选择的对象.
所以,我需要将项目加载到ListView.但是,我会从SubCategoryViewModel中的方法加载它们吗?我不这么认为.相反,我应该通过为它们创建一个ViewModel并将它绑定到ListView来从Main View Model加载它们,对吗?但是,我如何从SubCategoryViewModel调用HWDocumentViewModel中的方法?我应该写一个静态方法
在HWDocumentViewModel上可以从SubCategoryViewModel访问?
或者有没有办法,如何从SubCategoryViewModel调用在HWDocumentViewModel上定义的Command?

或者一般来说,我是否采用正确的方法在WPF中创建类似Warehouse的应用程序?

非常感谢.

编辑:我的TreeView的XAML看起来像这样:

<TreeView x:Name="tvCategories" Background="White" ItemsSource="{Binding Categories}">
                    <TreeView.ItemContainerStyle>
                        <Style TargetType="{x:Type TreeViewItem}">
                            <Setter Property="IsExpanded" Value="{Binding IsExpanded,Mode=TwoWay}" />
                            <Setter Property="IsSelected" Value="{Binding IsSelected,Mode=TwoWay}" />
                            <Setter Property="FontWeight" Value="Normal" />
                            <Setter Property="behaviors:MouseDoubleClick.Command"  Value="{Binding MouseDoubleClickCommand}" />
                            <Setter Property="behaviors:MouseDoubleClick.CommandParameter" Value="{Binding}" />
                            <Style.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="FontWeight" Value="Bold" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </TreeView.ItemContainerStyle>
                    <TreeView.Resources>
                        <HierarchicalDataTemplate DataType="{x:Type localvm:SubCategoryViewModel}" ItemsSource="{Binding Children}">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding CategoryName}" />
                            </StackPanel>
                        </HierarchicalDataTemplate>
                    </TreeView.Resources>

                </TreeView>

解决方法

我不确定我是否看到了这个问题.您有一个子类别树,当选择一个子类别时,相应的SubCategoryViewModel将自己设置为主HWDocumentViewModel上的SelectedCategory.这似乎是一种合理的方法.

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

如果您真的必须使用命令来调用加载,那么只需在每个SubCategoryViewModel中保留对主HWDocumentViewModel的引用,并使用简单的命令调用该命令:

_mainViewModel.LoadCategoryCommand.Execute();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读