>硬盘
>内部
>外部
> 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>
解决方法
那么为什么你需要调用命令呢?为什么不能只在HWDocumentviewmodel中加载新列表以响应其SelectedCategory属性的更改(即在setter中)?
如果您真的必须使用命令来调用加载,那么只需在每个SubCategoryviewmodel中保留对主HWDocumentviewmodel的引用,并使用简单的命令调用该命令:
_mainviewmodel.LoadCategoryCommand.Execute();