图片帮你理解
在名为A的UserControl中有B个窗口和B个ViewModel。我想知道在A视图模型中,当selectedItem在B窗口中发生变化时。(或在视图模型中引发事件)最好的方法是什么?
B窗口组合框
<ComboBox Height="30" ItemsSource="{Binding ModelCollection}"
DisplayMemberPath="Name"
SelectedItem="{Binding Model}"/>
进一步修改
谢谢你的回复。请检查一下这是不是一个好方法。
MainViewModel
Children1.OnContentChanged += new Children1.SelectedInfoChanged(Children2.SelectEvent);
Children1
public delegate void SelectedInfoChanged(Info info);
public event SelectedInfoChanged OnContentChanged;
public Info SelectInfo
{
get { return _selectInfo; }
set
{
if(SelectInfo != value)
_selectInfo = value;
OnContentChanged(_selectInfo);
}
}
}
Children2
public void SelectEvent(Info info)
{
}
一个常见的解决方案是在事件/消息的发布者和订阅者之间引入一个事件聚合器或消息传递器。然后订阅者和发布者只知道事件聚合器。它们对彼此一无所知,这意味着它们可以彼此独立进化。这反过来又会导致松耦合,从维护的角度来看,这是非常好的。最好的方法是什么?
关于这个概念的更多信息,请参考这篇博客文章。
另一个类似的选择是给你的视图模型(或其他组件)注入一个共享服务,并使用这个服务在它们之间进行通信。