我构建了一个自定义TreeView类,其中包含每个节点的设置,例如“name / background”等。我还有一个ICommand属性可以设置,以便每个节点都可以在必要时执行自定义方法。 p>
我在“treeview服务类”中构建所有这些,然后通过MVVMLight Messenger将菜单发送到usercontrol。这一切都很好,但我的问题是如果我没有为节点指定一个自定义命令,我希望它执行一个“默认操作”,它应该位于从Messenger服务收到消息的viewmodel中。 / p>
基本上我的问题是:我如何在MainViewModel中公开一个RelayCommand,以便在构建我的树时可以从另一个viewmodel(或我的服务类)引用它。
答案 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项目时,可以找到完整的小样本。
希望这有帮助!