2

主窗口下有 3 个用户控件。每个控件都有自己的保存按钮。主窗口有一个 SaveAll 按钮。

MainWindow 有一个 ContentControl,并且 content 属性绑定到 VM。在 ButtonClickCommand 上运行时,视图被实例化并分配给内容属性。

此 SaveAll 按钮将在内部调用与 UserControls Save 按钮关联的方法。因此,SaveAll 没有它自己的方法。

这必须由 DependencyProperty 实现。

我曾经在商业应用程序中看到过这种场景,但不知何故错过了它背后的概念。

我不明白这背后的逻辑是什么,但这是一件非常有用的事情。

现在我必须实现这一点,但我错过了一件小事,我不知道。

我希望情况很清楚。

请在这种情况下使用代码帮助我。

谢谢,VJ

4

2 回答 2

1

既然您提到了 MVVM,这就是您可能正在寻找的东西。请注意,如果您使用诸如 Caliburn 之类的 MVVM 框架,这将更加简洁和容易,但对于此示例,它只是普通的 MVVM:

public class MainViewModel
{
    public MainViewModel()
    {
        ViewOneModel = new SubViewModel();
        ViewTwoModel = new SubViewModel();
        Children = new List<SubViewModel>(new[] { ViewOneModel, ViewTwoModel });
    }

    public void SaveAll()
    {
        foreach(var child in Children)
        {
            child.Save();
        }
    }

    public IList<SubViewModel> Children { get; private set; }

    public SubViewModel ViewOneModel { get; set; }
    public SubViewModel ViewTwoModel { get; set; }
}

public class SubViewModel
{
    public void Save()
    {
    }
}

在 UI 上,您的主视图中基本上包含子视图(UserControls):

<StackPanel>
    <Button Width="100" Height="20" Content="Save All" />

    <local:ViewOne DataContext="{Binding ViewOneModel}" />

    <local:ViewTwo DataContext="{Binding ViewTwoModel}" />
</StackPanel>

您只需使用 ICommand 接口(最好是 RelayCommand 实例)将保存方法绑定到您的按钮。

于 2011-05-18T06:58:10.670 回答
0

在这种情况下恕我直言,不需要 RoutedEvents。我将解决它的方式:有一个 Main-ViewModel,它使用 Sub-ViewModels 公开 3 个属性。MainViewModel 是窗口的数据上下文,子视图模型绑定到 3 个用户控件的数据上下文。

子虚拟机正在使用保存命令公开属性。此命令绑定到用户控件中的保存按钮。主 vm 使用 saveall 命令公开一个属性,该命令绑定到 SaveAll 按钮。在 save all 命令的处理程序中,您将遍历子虚拟机并对其调用 save 。

于 2011-05-18T06:51:03.280 回答