0

私は単純な MVVM パターンを扱ってきましたが、それ以来、WPF でのデータ バインディングの全機能について詳しく調べてきました。頭を包み込むことができないという問題に遭遇しました。手始めに、次の MainWindowViewModel コードを取り上げます。

ObservableCollection<DataRecord> _SomeData = new ObservableCollection<DataRecord>();
public ObservableCollection<DataRecord> SomeData
{
    get
    {
        return _SomeData;
    }
    set
    {
        _SomeData = value;
    }
}

public MainWindowViewModel()
{
    CurrentViewModel.Add(new RandomViewModel(SomeData));
}

コード全体を貼り付ける代わりに、追加した各ベースの Image プロパティを参照して、ListBox を ViewModelBase の ObservableCollection<> にバインドしました (イメージ ナビゲーション)。今!問題の場合:

ListBox.SelectedItem から返された文字列を使用して、DataTemplate を使用して ViewModel からビューを参照しています。RandomViewModel にはパラメーターを渡す必要があるため、ListBox.SelectedItem をクリックすると、ListBox で作成されたビューではなく、新しいビューがインスタンス化されます。これが発生する理由は単純です。新しいビューでは、データバインディングのために参照するために RandomViewModel が必要です。そう!ViewModel/View Navigation に悪名高い ListBox.SelectedItem を使用して、ViewModel がパラメーターを渡す必要がある場合でも、View を作成し、その ViewModel を参照するにはどうすればよいですか? また!既にインスタンス化された ViewModel を使用し、それを新しく作成されたビューへの参照として使用するにはどうすればよいですか?

4

1 に答える 1

1

誰もがビューを最初に使用して MVVM を実行している理由がわかりません。私は最初にルート/メインウィンドウとおそらくログインダイアログだけにビューを使用します。アプリケーションの残りの部分では、ビュー/xaml をまったく気にせず、Viewmodel の最初のアプローチを採用します。これは、mvvm を使用すると非常に簡単です。あなたの場合、あなたの mainviewmodel はあなたがしたように randomviewmodel のリストを扱います。ただし、ランダム ビューを作成して randomviewmodel を割り当てる代わりに、選択した randomviewmodel を contentpresenter にバインドする必要があります。wpf はリソースを調べて、「この randomviewmodel をどのようにレンダリングすればよいか」というデータテンプレートを見つけます。目的のビューが表示されます。ビューの新しいインスタンスが作成されるたびにあなたのものですが、常に同じビューモデルが取得されます。

それが私にとってのmvvmです。ビューを気にしないで、ビューモデルを正しく処理してください。

于 2012-07-04T06:26:41.890 に答える