私は単純なタスクで約 14 日間苦労しています。データベースには、ハードウェア カテゴリの定義があります。例えば :
- HDD
- 内部
- 外部の
- 閃光
このリストは、次のように定義されたデータベースにあります。
[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
}
ここで、これらから、TreeView をバインドするSubCategoryViewModelという ViewModel を作成します。そのため、ツリービューでカテゴリを表示し、定義および維持された階層を使用できます。これはうまくいきます。SubCategoryViewModel では、 TreeView にもバインドされているMouseDoubleClick の Attached Behavior を介してCommandが定義されています。したがって、ユーザーがアイテムをダブルクリックすると、SubViewCategoryModelで定義されたメソッドが特定のコードを実行します。SubCategoryViewModelのリストは HWDocumentViewModelにネストされていますこれは私のウィンドウのメイン ViewModel です。今必要なことは明らかです。ユーザーが TreeView のアイテムをダブルクリックすると、データベースからアイテムをロードして ListView に表示する必要があります。私の意見では、HWDocumentViewModelではアイテムのコレクションを定義し、ListView で選択したカテゴリに応じてそれらをロードする必要があります。しかし、 SubCategoryViewModel からHWDocumentViewModelでメソッドを実行する方法がわかりません。理由: TreeView はSubCategoryViewModelアイテムのリストにバインドされているため、DoubleClick が発生すると、SubCategoryViewModelのメソッドが実行されます。メインViewModel(HWDocumentViewModel)でメソッドを実行する方法を探しています。
私はこのアプローチを試みました:
私はプロパティを作成しました: public static SubCategoryViewModel SelectedCategory
on HWDocumentViewModel
. ダブルクリックが発生すると、SubCategoryViewModel からこのプロパティを として設定しますthis
。したがって、このプロパティには doubleclick イベント デリゲートを実行するオブジェクトがあります。これで、HWDocumentView モデルにユーザーが選択したオブジェクトができました。
そのため、アイテムを ListView にロードする必要があります。しかし、SubCategoryViewModelのメソッドからロードしますか? 私はそうは思わない。代わりに、ビューモデルを作成してメイン ビュー モデルからロードし、それを ListView にバインドする必要があります。しかし、どのように SubCategoryViewModel から HWDocumentViewModel のメソッドを呼び出すことができますか? SubCategoryViewModel からアクセスできる HWDocumentViewModel に静的メソッドを作成する必要がありますか?
または、 HWDocumentViewModel で定義された Command を SubCategoryViewModel から呼び出す方法はありますか?
または、一般的に、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>