我的UI中有两个不同的用户控件。这些控件是UI层次结构中的兄弟节点。是否可以从一个用户控件触发命令并在另一个用户控件上处理它?</ p>
换句话说,我可以从其他用户控件(比如UserControlAViewModel)使用以下ViewModel中的ICommand属性吗?
class UserControlBViewModel : ViewModelBase
{
public ICommand Command
{
get
{
if (_Command == null)
{
_Command = new RelayCommand(param => this.CommandExecute(), param => this.CommandCanExecute);
}
return _Command ;
}
}
}
答案 0 :(得分:2)
这是你的情景吗?您有一个父视图有两个控件(ChildViewA和ChildViewB)。他们每个人都有自己的VM:
ParentView - ParentVM ChildViewA - ChildAVM ChildViewB - ChildBVM
ChildViewA使用RelayCommand执行在ChildAVM内处理的命令。 ChildAVM通知ParentVM该命令已执行。 ParentVM通知ChildBVM该命令已执行。 虚拟机如何相互通信取决于您需要/希望它们之间的连接松散程度。
实现此目的的一种简单方法是让子VM实现INotifyPropertyChanged。然后ParentVM可以加入PropertyChanged事件。该命令将导致ChildAVM上的某些属性发生变化,这将被ParentVM注意到。 parentVM接下来将在ChildBVM上设置一些属性。
答案 1 :(得分:1)
在Silverlight中,我会做类似以下的事情。它也应该在WPF中工作。
<Button x:Name="Btn01"
DataContext="{StaticResource Btn01ViewModel}"
Command="{Binding MyButtonCommand}"></Button>
<Button Command="{Binding DataContext.MyButtonCommand, ElementName=Btn01}"></Button>