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

前端之家收集整理的这篇文章主要介绍了c# – MVVM从其他ViewModel对ViewModel执行命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我现在用一个简单的任务苦苦挣扎了大约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();
原文链接:https://www.f2er.com/csharp/243274.html

猜你在找的C#相关文章