Я бьюсь уже около 14 дней с простой задачей:В базе данных у меня есть определения для категорий оборудования. Например:
Этот список находится в базе данных, определенной следующим образом:
[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>