0

我构建了一个自定义 TreeView 类,为每个节点设置了“名称/背景”等。我还有一个可以设置的 ICommand 属性,以便每个节点可以在必要时执行自定义方法。

我在“树视图服务类”中构建所有这些,然后通过 MVVMLight Messenger 将菜单发送到用户控件。这一切都很好,但我的问题是,如果我没有为节点指定自定义命令,我希望它执行“默认操作”,该操作应该位于从 Messenger 服务接收消息的视图模型中。

基本上我的问题是:如何在 MainViewModel 中公开 RelayCommand ,以便在构建树时可以从另一个视图模型(或我的服务类)引用它。

4

2 回答 2

0

我相信 RelayCommand 是一个 ICommand。您可以将其作为视图模型上的属性公开:

public ICommand MyCommand { get; set;} 
于 2013-03-20T19:29:45.723 回答
0

要在 ViewModel B 中引用 ViewModel A,您可以像在模板示例中一样使用 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;
        }
    }
}

当您使用 MVVM Light 视觉工作室模板创建 MVVM Light 项目时,您可以找到一个完整的小示例。

希望这可以帮助!

于 2013-03-20T22:45:17.507 回答