1

我有一个遵循 MVVM 模式的 Windows Store 应用程序。我有一个包含 GridView 控件的父视图(具有匹配的父 ViewModel)。该 GridView 控件的 ItemTemplate 包含一个子视图。该子视图包含几个按钮。

如何将其连接起来,以便当用户单击其中一个 ChildView 控件上的按钮时,会在 Parent ViewModel 上调用一个方法?

4

2 回答 2

1

有两种方法可以做到这一点。

  • 您可以使用的第一个是 - 将您的按钮绑定到在您的父视图模型中定义的命令,您可以在其中完成您的工作。
  • 第二个是 - 你可以使用 mvvm messenger 类。您必须在其中将消息从按钮单击事件处理程序发送到您的视图模型。当您收到此消息时,添加一些事件处理程序并在那里执行您的工作。
于 2013-07-04T05:17:31.440 回答
0

这就是我解决这个问题的方法。

  1. 在后面的子视图代码上添加 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;
    }
    
  2. 在父视图模型中,添加 ICommand 类型的公共 getter 属性,使用 RelayCommand 实现,您可以在此处找到:https ://relaycommandrt.codeplex.com/

  3. 在 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 上的属性。

于 2013-07-05T00:09:55.920 回答