2

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

在其中一个 UserControls 中,有一个ComboBoxand SelectionChanged,我需要更新其他 UserControls 以及容器Window(即它们相应的 ViewModel)。

我试图放弃为这些用户控件使用 ViewModel 的想法,而是将它们的功能放在容器表单的 ViewModel 上,但这似乎并不正确,因为用户控件实际上做了很多事情,而且将所有东西都放在容器上非常复杂windows的视图模型。

有什么办法可以实现这一点,还是我应该使用“容器窗口的 ViewModel 上的所有内容”?

非常感谢任何帮助。

4

1 回答 1

1

您可以通过使用delegates. delegates您可以从 MSDN 上的Delegates(C# 编程指南)页面了解更多信息。

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

public delegate void ParentNotification(YourDataType dataTypeInstance);

然后是一个 getter 一个 setter:

public ParentNotification OnSelectionChanged { get; set; }

现在,实例化的窗口UserControl可以为这些委托中的每一个注册一个处理程序:

<YourXmlNamespace:YourUserControl OnSelectionChanged="OnSelectionChangedhandler" />

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

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

难题的最后一部分是在发生任何情况后调用delegatefrom each 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);
        }
    }
}
于 2013-08-30T08:23:49.093 回答