从WPF中的一个UserControl中的PropertyChanged命令更新其他ViewModels和Container表单

时间:2013-08-30 08:03:24

标签: c# wpf xaml mvvm user-controls

我正在使用带有一组UserControl的WPF Window,每个UserControl都有自己的ViewModel。在容器Window的ViewModel上,我有他们的ViewModel实例。

在其中一个UserControl中,有一个ComboBox,在SelectionChanged上,我需要更新其他UserControls以及容器Window(即它们对应的ViewModel)。 / p>

我试图废弃为这些用户控件使用ViewModel的想法,而是在容器表单的ViewModel上使用它们的功能,但这似乎不对,因为用户控件实际上做了很多,而且它非常复杂容器窗口'ViewModel。

上的所有内容

有没有办法实现这个目标,还是应该使用“容器窗口的ViewModel上的所有东西”?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

使用delegate s,您可以轻松实现所需(使用每个控件的视图模型)。您可以在MSDN的Delegates (C# Programming Guide)页面上找到有关delegates的更多信息。

基本上,您需要在delegate个对象中创建一个或多个UserControl ...它们非常适合将信息从父母传递给孩子,反之亦然:

public delegate void ParentNotification(YourDataType dataTypeInstance);

然后一个吸气剂为每个吸气剂:

public ParentNotification OnSelectionChanged { get; set; }

现在,实例化UserControl的窗口可以为每个代理注册一个处理程序:

<YourXmlNamespace:YourUserControl OnSelectionChanged="OnSelectionChangedhandler" />

然后添加一个与delegate中的MainWindow.xaml.cs的定义匹配的处理程序:

public void OnSelectionChangedhandler(YourDataType dataTypeInstance)
{
    // do something with dataTypeInstance
}

最后一个难题是在发生任何条件后从每个delegate调用UserControl ...在这种情况下,条件是选择更改:

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);
        }
    }
}