我有一个WPF Window
,它有一组UserControls,每个都有自己的ViewModel。在容器Window
的ViewModel上,我有它们的ViewModel的实例。
在其中一个UserControls中,有一个ComboBox
,在它的SelectionChanged
上,我需要更新其他UserControls以及容器Window
(即它们对应的ViewModels)。
我试图放弃为这些用户控件设置ViewModel的想法,而是将它们的功能放在容器窗体的ViewModel上,但这似乎是不对的,因为用户控件实际上做了很多工作,而且将所有内容都放在容器窗口的ViewModel中非常复杂。
有什么方法可以实现这一点吗?还是应该使用"容器窗口的ViewModel上的所有内容"?
非常感谢您的帮助。
使用delegate
s可以轻松实现您想要的内容(每个控件都有一个视图模型)。您可以从MSDN上的Delegates(C#编程指南)页面了解有关delegates
的更多信息。
基本上,您需要在UserControl
对象中创建一个或多个delegate
。。。它们非常适合将信息从父母传递给孩子,反之亦然:
public delegate void ParentNotification(YourDataType dataTypeInstance);
然后一个getter为每个setter:
public ParentNotification OnSelectionChanged { get; set; }
现在,实例化UserControl
的窗口可以为每个委托注册一个处理程序:
<YourXmlNamespace:YourUserControl OnSelectionChanged="OnSelectionChangedhandler" />
然后添加一个与MainWindow.xaml.cs
:中delegate
的定义匹配的处理程序
public void OnSelectionChangedhandler(YourDataType dataTypeInstance)
{
// do something with dataTypeInstance
}
难题的最后一块是在出现任何条件后从每个UserControl
调用delegate
。。。在这种情况下,条件是选择发生了变化:
private void ComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
{
YourDataType dataTypeInstance = null;
if (e.AddedItems.Count > 0)
{
dataTypeInstance = (YourDataType)e.AddedItems[0];
if (OnSelectionChanged != null) // very important check here
{
OnSelectionChanged(dataTypeInstance);
}
}
}