我有一个遵循 MVVM 模式的 Windows Store 应用程序。我有一个包含 GridView 控件的父视图(具有匹配的父 ViewModel)。该 GridView 控件的 ItemTemplate 包含一个子视图。该子视图包含几个按钮。
如何将其连接起来,以便当用户单击其中一个 ChildView 控件上的按钮时,会在 Parent ViewModel 上调用一个方法?
我有一个遵循 MVVM 模式的 Windows Store 应用程序。我有一个包含 GridView 控件的父视图(具有匹配的父 ViewModel)。该 GridView 控件的 ItemTemplate 包含一个子视图。该子视图包含几个按钮。
如何将其连接起来,以便当用户单击其中一个 ChildView 控件上的按钮时,会在 Parent ViewModel 上调用一个方法?
有两种方法可以做到这一点。
这就是我解决这个问题的方法。
在后面的子视图代码上添加 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;
}
在父视图模型中,添加 ICommand 类型的公共 getter 属性,使用 RelayCommand 实现,您可以在此处找到:https ://relaycommandrt.codeplex.com/
在 Parent View 的 Xaml 中,绑定 ChildView 中的 ChildButtonCommand:
<GridView.ItemTemplate>
<DataTemplate>
<views:ChildView ChildButtonCommand="{Binding ElementName=ParentView, Path=DataContext.PropertyOnParentViewModel}"/>
</DataTemplate>
仔细检查绑定语法。由于我们位于 GridView 项的 DataTemplate 中,因此我们的 DataContext不是父视图模型。(它是子项对象)。如果我们想将按钮命令绑定到父视图模型,我们需要引用父视图中的某些内容。在这种情况下,我将视图命名为“ParentView”。使用 Binding ElementName 语法,我可以绑定到 ParentView 的 DataContext,更具体地说,可以绑定到 ParentViewModel 上的属性。