sin*_*ien 6 c# wpf mvvm icommand
我现在用一个简单的任务苦苦挣扎了大约14天:在数据库中,我有硬件类别的定义.例如 :
此列表在数据库中定义如下:
[ID - ParrentID - Name] : 1 - 0 - HDD, 2 - 1 - Internal, 3 - 1 - External, 4 - 1 - Flash.
Run Code Online (Sandbox Code Playgroud)
通过实体框架,我将这些行放入我的应用程序中.从这个平面数据我然后创建结构化对象,这是我的DataModel.该模型定义如下:
public class Category
{
private int _id = -1;
private string _name = "";
private List<Category> _subCategories = null;
// property getters and setters, constructors, and bool HasSubCategories
}
Run Code Online (Sandbox Code Playgroud)
现在,从这些我创建名为SubCategoryViewModel的 ViewModel 绑定到我的TreeView.因此,我可以在树视图中查看我的类别,并使用我定义和维护的层次结构.这很好用.在SubCategoryViewModel定义一个命令通过用于MouseDoubleClick附加的行为也被绑定到树视图.因此,当用户双击Item时,在SubViewCategoryModel中定义的方法将执行特定的代码.清单 SubCategoryViewModel嵌套在HWDocumentViewModel这是我的窗口主视图模型.我现在需要的是显而易见的:当用户双击TreeView中的项目时,我需要从数据库加载项目并在ListView中显示它们.我的意见是,在HWDocumentViewModel中,我需要定义一个Items集合,并相应地将它们加载到ListView中的选定类别.但是,我不知道如何从HWDocumentViewModel执行方法SubCategoryViewModel.因为:TreeView绑定到SubCategoryViewModel项的列表,因此当发生DoubleClick时,将执行SubCategoryViewModel上的方法.我正在寻找一种方法,如何在主ViewModel(HWDocumentViewModel)上执行方法.
我试过这种方法:
我创建了一个属性:public static SubCategoryViewModel SelectedCategoryon HWDocumentViewModel.当双击发生时,我将此属性从SubCategoryViewModel设置为this.所以,在这个属性中是object,它执行了doubleclick事件委托.太棒了,现在我在HWDocumentView模型中有一个用户选择的对象.
所以,我需要将项目加载到ListView.但是,我会从SubCategoryViewModel中的方法加载它们吗?我不这么认为.相反,我应该通过为它们创建一个ViewModel并将它绑定到ListView来从Main View Model加载它们,对吗?但是,我如何从SubCategoryViewModel调用HWDocumentViewModel中的方法?我应该在可以从SubCategoryViewModel访问的HWDocumentViewModel上编写静态方法吗?
或者有没有办法,如何从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>
Run Code Online (Sandbox Code Playgroud)
我不确定我是否看到了这个问题.您有一个子类别树,当选择一个子类别时,相应的SubCategoryViewModel设置将自己设置为SelectedCategory主要类别HWDocumentViewModel.这似乎是一种合理的方法.
那么为什么你需要调用命令呢?为什么不能只是加载新列表以HWDocumentViewModel响应其SelectedCategory属性的更改(即在setter中)?
如果你真的必须使用一个命令来调用加载,那么只需HWDocumentViewModel在每个SubCategoryViewModel命令中保持对main的引用,并用一个简单的命令调用命令:
_mainViewModel.LoadCategoryCommand.Execute();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10625 次 |
| 最近记录: |