0

「名前/背景」などの各ノードの設定を使用して、カスタムTreeViewクラスを作成します。また、必要に応じて各ノードでカスタムメソッドを実行できるように設定できるICommandプロパティもあります。

これらすべてを「ツリービューサービスクラス」で構築し、MVVMLightメッセンジャーを介してメニューをユーザーコントロールに送信します。これはすべて問題なく機能しますが、私の問題は、ノードにカスタムコマンドを指定しない場合、Messengerサービスからメッセージを受信するビューモデルにある「デフォルトアクション」を実行することです。

基本的に私の質問は次のとおりです。ツリーを構築するときに、別のビューモデル(またはサービスクラス)からRelayCommandを参照できるように、MainViewModelでRelayCommandを公開するにはどうすればよいですか。

4

2 に答える 2

0

ViewModelBでViewModelAを参照するには、テンプレートサンプルのようにMVVMLightのViewModelLocatorを使用できます。

ViewModelLocatorクラス:

 public class ViewModelLocator
 {
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        // Register your services
        //...
        // Register your ViewModels
        SimpleIoc.Default.Register<MainViewModel>();
    }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }
}

また、NodeViewModelでは、たとえば次のようにデフォルトのコマンドにアクセスできます。

  public class NodeViewModel : ViewModelBase
  {
    private ViewModelLocator locator = new ViewModelLocator();

    public RelayCommand NodeCommand
    {
        get
        {
            return locator.Main.DefaultCommand;
        }
    }
}

MVVMLightビジュアルスタジオテンプレートを使用してMVVMLightプロジェクトを作成すると、完全な小さなサンプルを見つけることができます。

お役に立てれば!

于 2013-03-20T22:45:17.507 に答える
0

RelayCommandはICommandだと思います。ビューモデルのプロパティとして公開するだけです。

public ICommand MyCommand { get; set;} 
于 2013-03-20T19:29:45.723 に答える