在WinRT中的GridView中公开MVVM用户控件的命令

时间:2013-07-03 23:17:21

标签: xaml windows-store-apps winrt-xaml

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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. 在Parent ViewModel中,添加一个ICommand类型的公共getter属性,使用您可以在此处找到的RelayCommand实现:https://relaycommandrt.codeplex.com/

  3. 在父视图的Xaml中,在子视图中绑定ChildButtonCommand:

    <GridView.ItemTemplate>
    <DataTemplate>
        <views:ChildView ChildButtonCommand="{Binding ElementName=ParentView, Path=DataContext.PropertyOnParentViewModel}"/>
    </DataTemplate>
    

  4.   

    仔细检查绑定语法。由于我们在GridView项目的DataTemplate中,我们的DataContext 不是父视图模型。(它是子项目对象)。如果我们想将button命令绑定到Parent View Model,我们需要在父视图中引用某些内容。在这种情况下,我将视图命名为“ParentView”。使用Binding ElementName语法,我可以绑定到ParentView的DataContext,更具体地说是ParentViewModel上的属性。