我有一个遵循MVVM模式的Windows应用商店应用程序。 我有一个包含GridView控件的父视图(具有匹配的父ViewModel)。 该GridView控件的ItemTemplate包含一个子视图。 该子视图包含几个按钮。
如何连接它,以便当用户单击其中一个ChildView控件上的按钮时,会在Parent ViewModel上调用一个方法?
答案 0 :(得分:1)
有两种方法可以做到这一点。
答案 1 :(得分:0)
这就是我解决这个问题的方法。
在后面的子视图代码上添加ICommand支持的依赖项属性。
public static readonly DependencyProperty ChildButtonCommandProperty = DependencyProperty.Register("ChildButtonCommand", typeof(ICommand), typeof(ChildView),new PropertyMetadata(null, OnChildButtonCommandChanged));
public ICommand ChildButtonCommand
{
get { return (ICommand)GetValue(ChildButtonCommandProperty); }
set { SetValue(ChildButtonCommandProperty, value); }
}
private static void OnChildButtonCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var self = (ChildView)sender;
self.ChildButtonCommand.Command = (ICommand)e.NewValue;
}
在Parent ViewModel中,添加一个ICommand类型的公共getter属性,使用您可以在此处找到的RelayCommand实现:https://relaycommandrt.codeplex.com/
在父视图的Xaml中,在子视图中绑定ChildButtonCommand:
<GridView.ItemTemplate>
<DataTemplate>
<views:ChildView ChildButtonCommand="{Binding ElementName=ParentView, Path=DataContext.PropertyOnParentViewModel}"/>
</DataTemplate>
仔细检查绑定语法。由于我们在GridView项目的DataTemplate中,我们的DataContext 不是父视图模型。(它是子项目对象)。如果我们想将button命令绑定到Parent View Model,我们需要在父视图中引用某些内容。在这种情况下,我将视图命名为“ParentView”。使用Binding ElementName语法,我可以绑定到ParentView的DataContext,更具体地说是ParentViewModel上的属性。