WPF依赖属性解决方法

时间:2011-05-18 05:08:09

标签: wpf mvvm dependency-properties routed-events

MainWindow下有3个UserControl。每个控件都有自己的保存按钮。 Mainwindow有一个SaveAll按钮。

MainWindow有一个ContentControl,内容属性绑定到VM。在ButtonClickCommand的运行时,View被实例化并分配给Content Property。

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

这必须由DependencyProperty实现。

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

我无法得到这背后的逻辑,但这是一个非常有用的东西。

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

我希望情景很清楚。

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

谢谢, VJ

2 个答案:

答案 0 :(得分: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实例)将保存方法绑定到按钮。

答案 1 :(得分:0)

Imho在这种情况下不需要RoutedEvents。我会解决它的方式: 有一个Main-ViewModel使用Sub-ViewModel公开3个属性。 MainViewModel是窗口的Datacontext,子视图模型绑定到3个用户控件的datacontext。

sub vm用一个Save-Command公开一个属性。此命令绑定到usercontrols中的保存按钮。 主vm使用saveall命令公开属性,该命令绑定到SaveAll按钮。 在save all命令的处理程序中,您将遍历子vm并调用它们上的保存。