从WPF中某个UserControls中的PropertyChanged命令更新其他ViewModels和Contain



我有一个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);
        }
    }
}

最新更新