我现在正通过一个简单的任务苦苦挣扎约14天:在数据库中,我有硬件类别的定义。例如 :

  • 硬盘
  • 内部
  • 外部
  • Flash

  • 该列表在数据库中定义如下:
        [ID - ParrentID - Name] : 1 - 0 - HDD, 2 - 1 - Internal, 3 - 1 - External, 4 - 1 - Flash.
    

    通过 Entity Framework ,我将这些行输入到我的应用程序中。然后根据这些平面数据创建结构化对象,即我的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,并将其绑定(bind)到我的TreeView。因此,我可以在树 View 中以及定义和维护的层次结构中查看类别。这样很好。在SubCategoryViewModel中,通过MouseDoubleClick的附加行为定义了命令,该命令也绑定(bind)到TreeView。因此,当用户双击Item时,在SubViewCategoryModel中定义的方法将执行特定的代码。 SubCategoryViewModel的列表嵌套在HWDocumentViewModel中,它是我的窗口的主要ViewModel。
    现在我需要的是显而易见的:当用户双击TreeView中的项目时,我需要从数据库中加载项目并在ListView中显示它们。我的看法是,在HWDocumentViewModel中,我需要定义一个Items集合并将它们相应地加载到ListView中的选定类别。但是,我不知道如何在SubCategoryViewModel的HWDocumentViewModel上执行方法。因为:TreeView绑定(bind)到SubCategoryViewModel项目列表,所以当发生DoubleClick时,将执行SubCategoryViewModel上的方法。我正在寻找一种方法,如何在主ViewModel(HWDocumentViewModel)上执行方法。

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

    还是总的来说,我是否采用了正确的方法在WPF中创建类似于仓库的应用程序?

    非常感谢。

    编辑:我的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将自身设置为在主SelectedCategory HWDocumentViewModel。这似乎是一种合理的方法。

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

    如果确实必须使用命令来调用负载,那么只需在每个HWDocumentViewModel中保留对您的主要SubCategoryViewModel的引用,然后使用以下简单的命令即可调用该命令:

    _mainViewModel.LoadCategoryCommand.Execute();
    

    08-06 01:29