在服务类的viewmodel中执行relaycommand

时间:2013-03-20 19:08:23

标签: c# mvvm viewmodel mvvm-light relaycommand

我构建了一个自定义TreeView类,其中包含每个节点的设置,例如“name / background”等。我还有一个ICommand属性可以设置,以便每个节点都可以在必要时执行自定义方法。 p>

我在“treeview服务类”中构建所有这些,然后通过MVVMLight Messenger将菜单发送到usercontrol。这一切都很好,但我的问题是如果我没有为节点指定一个自定义命令,我希望它执行一个“默认操作”,它应该位于从Messenger服务收到消息的viewmodel中。 / p>

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

2 个答案:

答案 0 :(得分:0)

我相信RelayCommand是一个ICommand。您可以在viewmodel上将其公开为属性:

public ICommand MyCommand { get; set;} 

答案 1 :(得分: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项目时,可以找到完整的小样本。

希望这有帮助!