6

私は単純なタスクで約 14 日間苦労しています。データベースには、ハードウェア カテゴリの定義があります。例えば ​​:

  1. 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 SelectedCategoryon 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>
4

2 に答える 2

5

問題が発生するかどうかはわかりません。サブカテゴリのツリーがあり、1つを選択すると、適切なものがメインのようにSubCategoryViewModel設定されます。それは合理的なアプローチのようです。SelectedCategoryHWDocumentViewModel

では、なぜコマンドを呼び出す必要があるのでしょうか。プロパティHWDocumentViewModelの変更に応じて(つまり、セッターに)新しいリストをロードできないのはなぜですか?SelectedCategory

本当にコマンドを使用してロードを呼び出す必要がある場合はHWDocumentViewModel、それぞれSubCategoryViewModelにメインへの参照を保持し、次の単純なコマンドを使用してコマンドを呼び出します。

_mainViewModel.LoadCategoryCommand.Execute();
于 2012-04-09T15:10:00.483 に答える
3

MVVMを使用し、ViewとViewModel間、またはViewModel間で通信を試みると、パブリッシャー/サブスクライバーのセットアップが適切に機能するか、MVVMLightやPrismに見られるようなメッセージングパラダイムが機能します。MVVMLightのメッセージング設定に関する回答をここに投稿しました

メッセージでは、ビューモデル間で送受信したいデータを保持するオブジェクトを送信できます。

mvvmを使用する場合は、フレームワークを使用することを強くお勧めします。MVVMフレームワークの比較は、いくつかの主要なフレームワークの比較を通過する回答へのリンクです。

于 2012-04-09T13:58:02.740 に答える