MainWindow下有3个UserControl。每个控件都有自己的保存按钮。 Mainwindow有一个SaveAll按钮。
MainWindow有一个ContentControl,内容属性绑定到VM。在ButtonClickCommand的运行时,View被实例化并分配给Content Property。
此SaveAll按钮将在内部调用与UserControls Save按钮关联的方法。因此,SaveAll没有自己的方法。
这必须由DependencyProperty实现。
我曾经看过这个场景在商业应用程序中实现,但不知何故错过了它背后的概念。
我无法得到这背后的逻辑,但这是一个非常有用的东西。
现在我必须实现这一点,但我错过了一件小事,我不知道。
我希望情景很清楚。
请使用代码在这种情况下帮助我。
谢谢, VJ
答案 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并调用它们上的保存。