我建立了一个自定义TreeView类,为每个节点设置,如"name/background"等。我还可以设置一个iccommand属性,以便每个节点都可以在必要时执行自定义方法。
我在"treeview服务类"中构建所有这些,然后通过MVVMLight Messenger将菜单发送给用户控件。这一切都工作得很好,但我的问题是,如果我不为节点指定自定义命令,我希望它执行"默认操作",该操作应该位于从Messenger服务接收消息的视图模型中。
基本上我的问题是:我如何在MainViewModel中暴露RelayCommand,以便我可以从另一个视图模型(或我的服务类)引用它,当构建我的树。
要在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 visual studio模板创建MVVM Light项目时,你可以找到一个完整的小样本。
希望这对你有帮助!
我相信RelayCommand是一个iccommand。你可以把它作为视图模型的属性公开:
public ICommand MyCommand { get; set;}