2

Mvvm Light Devotees の皆さんは、次の状況にどのように対処しますか? 「子」ビューモデルの独自のインスタンスを使用する「マスター」ビューモデルがいくつかあります。すなわち

子 ViewModel - "OrderLineItemListViewModel" 注文の品目リストのビューモデル。

親 ViewModel - "OrderDetailViewModel" 注文のビューモデル。親ビューモデル - 「OrderChargeViewModel」は、注文を請求するためのビューモデルです。

両方の親 ViewModel に OrderLineItems のリストが必要であり、両方を同時に開くことができます。現在、親ViewModelに子ViewModel型のプロパティが含まれており、それを参照できるように設定しています。

public class ChildViewModel
{
    public ChildViewModel()
    {
       Items = new ObservableCollection<ListItemViewModel>
                   {
                      new ListItemViewModel("One"),
                      new ListItemViewMOdel("Two")
                   }
    }

    public ObservableCollection<ListItemViewModel> Items {get; private set;}
}

public class ParentViewModel
{
    public ParentViewModel()
    {
        ChildViewModel = new ChildViewModel();
    }

    public ChildViewModel ChildViewModel {get; set;}
}

<Window>
    <DataGrid ItemsSource={Binding ChildViewModel.Items} />
</Window>

今、私は ViewModelLocator と Messaging でこれを行う方法があるはずだと感じていますが、そうするためのきれいな方法を見つけていません。ViewModelLocator を使用して ViewModel の非シングルトン インスタンスを作成する方法を知っているので、問題ありません。ただし、親ViewModelが子ViewModelメッセージに応答し、メッセージが「その」子ViewModelからのものであり、したがって対処する必要があるかどうかを知る方法はわかりません。

これを処理する方法について誰かアドバイスがありますか、それとも今のやり方を続けるべきですか? 私が考えている最大の部分は、現在、ViewModelLocator を選択的に使用していて、それが最終的に直感的になるかどうかわからないということです。

4

1 に答える 1

1

この合計があなたの質問に答えているかどうかはわかりませんが、私が持っているのはあなたのようなネストされたビューモデルです。コレクション (この場合はエンティティ フレームワークのナビゲーション プロパティ) を持つ親ビュー/ビューモデルがあり、子ビュー/ビューモデルと相互作用させたいと考えています。そうすれば、メッセージなしで「相互作用」を行うことができます。

たとえば、コレクションを親から子ビュー モデルのコンボボックスにバインドする場合は、このようにします (親ビューと子ビューはユーザー コントロールであり、親ビューではコンテンツ コントロールがにバインドされていることに注意してください)。子ビュー/ビューモデル):

<UserControl x:Class="EmployeeListView"
            DataContext="{Binding EmployeeList_VM, Source={StaticResource Locator}}"/>
    <ContentControl Name="DetailControl" DataContext="{Binding Path=Selection, Mode=TwoWay}" >
        <ComboBox Name="cbStatus" 
            ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.EmployeeStatus}"
            SelectedItem="{Binding ElementName=DetailControl, Path=DataContext.employee_status}"
            SelectedValuePath="idStatus"
            SelectedValue="{Binding idStatus, Mode=TwoWay, ValidatesOnDataErrors=True}"
            DisplayMemberPath="chrCode"/>
    </ContentControl>
</UserControl>

できるだけシンプルにしようとしました。私がバインドしているコレクション(EmployeeStatus)を含む祖先のユーザーコントロールデータコンテキストにバインドされているitemsourceに注意してください。このようにして、メッセージングを使用せずに、子ビューモデルが親 VM コレクション/オブジェクトと対話できます。それ以外の場合は、メッセージングを使用して特定のビューモデルをターゲットにしていますが、それが探しているものである場合は、上記の方が簡単かもしれません。

編集: あなたのコメントに応えて、ここでの課題は、親子ビューモデルを分離したいが、同時に、どちらが「ペア」であるかを識別できるようにしたいことだと思います。したがって、これを行う方法は、親と子のビューモデルで一致するプロパティを持つある種のフラグ/識別子を作成することです。親ビューモデルのコンストラクターでこのプロパティを設定し、コンストラクターでこの識別子を受け入れてそのプロパティを設定する子ビューモデル用の 2 番目のコンストラクターを用意します。次に、メッセンジャーを使用して親のビューモデル タイプをターゲットにし、識別子をメッセージのパラメーターとして渡します。次に、メッセンジャーを親ビューモデルに登録して、その「タイプ」を対象とするメッセージを「リッスン」します。

子ビュー モデルに 2 つのコンストラクターを用意することで、子ビュー モデルを他の場所で引き続き使用でき、親ビュー モデルのプロパティ タイプに直接依存しないため、それらを結合することを回避できます。

これが理にかなっていることを願っています。あなたはメッセンジャーに精通していると言ったので、タイプをターゲットにしてメッセージにパラメーターを追加する方法の例を投稿しませんでしたが、必要に応じて投稿できます.

お役に立てれば。

于 2013-03-12T19:37:42.790 に答える