10

私のプログラムは、地上レベルで aTreeViewと 2で構成されています。contentPresentersmainWindow、TreeView、およびそれぞれcontentPresenterに独自の viewModel があります。

mainWindowViewModelからの関数を呼び出したいと思いTreeViewViewModelます。

mainWindowViewModelに表示される内容を制御するため、これを行う必要がありcontentPresenters、表示を手動で更新したいと考えています。

まさかこんなことをするなんて…

TreeViewViewModel:

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

MainWindowVM次を使用してからにアクセスしようとしましたTreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

しかし、それはあまり意味がありません。MWVM は の ではないためDataContextですTreeViewViewModel

4

2 に答える 2

11

これdelegateとリンクされた回答で使用される方法は、任意の親子関係で、どちらの方向にも使用できます。これには、子ビュー モデルから親ビュー モデルへの変換Window、コード ビハインドから子のコード ビハインド、Windowさらには UI が関与しない純粋なデータ関係が含まれます。delegateオブジェクトの使用について詳しくは、MSDN のDelegates (C# Programming Guide)ページを参照してください。

今日、これと同様の質問に答えました。ビューモデル間のパラメーターの受け渡しの投稿を見ると、その答えにはdelegateオブジェクトの使用が含まれていることがわかります。delegateこれらの(回答からの)をメソッドに置き換えるだけで、同じように機能します。

ご不明な点がございましたら、お知らせください。


更新 >>>

はい、申し訳ありませんが、代わりにメソッドを呼び出すことを完全に忘れていました...今夜はあまりにも多くの投稿に取り組んでいます。ParameterViewModel_OnParameterChangeしたがって、他の投稿の例を引き続き使用して、ハンドラーでメソッドを呼び出すだけです。

public void ParameterViewModel_OnParameterChange(string parameter)
{
    // Call your method here
}

delegateは、親ビュー モデルに戻るパスであると考えてください... というイベントを発生させるようなものReadyForYouToCallMethodNow.です。実際には、入力パラメーターさえ必要ありません。delegate次のように定義できます。

public delegate void ReadyForUpdate();

public ReadyForUpdate OnReadyForUpdate { get; set; }

次に、親ビュー モデルで (他の例のようにハンドラーをアタッチした後):

public void ChildViewModel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}

複数の子ビュー モデルがあるためdelegate、両方がアクセスできる別のクラスで を定義できます。ご不明な点がございましたら、お気軽にお問い合わせください。


更新 2 >>>

あなたの最後のコメントをもう一度読んだ後、私はあなたが望むものを達成するかもしれないもっと簡単な方法を考えました...少なくとも、私があなたを正しく理解していれば。Bind子ビューから親ビュー モデルに直接移動することができます。たとえば、これにより、子ビューのプロパティから親ビュー モデルのプロパティに移動できますBindButton.CommandICommand

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />

DataContextこれはもちろん、問題の親ビュー モデルのインスタンスがのとして設定されていることを前提としていますMainWindow

于 2013-10-22T15:41:31.260 に答える