MVVM Execute Command на ViewModel из другой ViewModel

Я бьюсь уже около 14 дней с простой задачей:В базе данных у меня есть определения для категорий оборудования. Например:

  1. Жесткий диск
    • Внутренний
    • Внешний
    • 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
}  

Теперь из них я создаю ViewModel с именем SubCategoryViewModel , к которому привязан мой TreeView. Итак, я могу просматривать свои категории в виде дерева и с моей определенной и поддерживаемой иерархией. Это прекрасно работает. В SubCategoryViewModel определено Command - Прикрепленное поведение для MouseDoubleClick , которое также привязано к TreeView. Таким образом, когда пользователь дважды щелкает элемент, в SubViewCategoryModel определенный метод будет выполнять определенный код. Список SubCategoryViewModel вложен в HWDocumentViewModel , которая является основной ViewModel для моего окна. То, что мне сейчас нужно, очевидно :Когда пользователь дважды щелкает элемент в TreeView, мне нужно загрузить элементы из базы данных и отобразить их в ListView. Я считаю, что в HWDocumentViewModel мне нужно определить набор элементов и загрузить их в соответствии с выбранной категорией в ListView. Но я не знаю, как выполнить метод HWDocumentViewModel из SubCategoryViewModel . Поскольку :TreeView привязан к списку элементов SubCategoryViewModel , поэтому при возникновении DoubleClick выполняется метод для SubCategoryViewModel . Я ищу способ,как выполнить метод в основной ViewModel (HWDocumentViewModel ).

Я попробовал этот подход:
Я создал свойство:public static SubCategoryViewModel SelectedCategoryна HWDocumentViewModel. Когда происходит двойной щелчок, я устанавливаю это свойство из SubCategoryViewModel как this. Итак, в этом свойстве находится объект, который выполнил делегат события doubleclick. Отлично, теперь у меня есть в модели HWDocumentView объект, который выбрал пользователь.
Итак, мне нужно загрузить элементы в ListView. Но буду ли я загружать их из метода в SubCategoryViewModel ? Я так не думаю. Вместо этого я должен загрузить их из модели основного представления, создав для них ViewModel и привязав ее к ListView, верно? Но как я могу из SubCategoryViewModel вызвать метод в HWDocumentViewModel? Должен ли я написать статический метод в HWDocumentViewModel, который будет доступен из SubCategoryViewModel?
Или есть способ вызвать команду, определенную в HWDocumentViewModel, из SubCategoryViewModel?

Или вообще правильно ли я подошёл к созданию приложения типа Warehouse-в WPF?

Большое спасибо.

РЕДАКТИРОВАТЬ:XAML для моего TreeView выглядит следующим образом:

<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>
6
задан sinkien 9 April 2012 в 14:51
поделиться