CommandParameter绑定(从嵌套子控件到父控件)

时间:2015-12-14 20:01:15

标签: c# wpf xaml data-binding

我正在重构一些具有以下结构的传统WPF代码 -

ChildControl - > ParentControl - > ParentView

ChildControl具有ICommand类型的DependencyProperty。 ParentControl具有ICommand类型的DependencyProperty。 ParentView绑定到ViewModel,让我们称之为ParentViewModel,并公开ICommand类型的公共属性。

ChildControl有一个ContextMenu,其中一个菜单项需要将Command属性绑定到ParentViewModel中的ICommand属性。因此,ContextMenu的DataContext绑定到自身的PlacementTarget,MenuItem上的Command属性绑定到ChildControl中类型为ICommand的DependencyProperty。

ParentControl,公开ChildControl,将ChildControl中的ICommand DependencyProperty绑定到ParentControl中的ICommand DependencyProperty。

ParentView,它公开ParentControl,将ParentControl中的ICommand DependencyProperty绑定到ParentViewModel中的ICommand属性。

然而,我需要的是将ChildControl中的MenuItem上的CommandParameter绑定到底层的ViewModel(让我们称之为ChildViewModel)。我认为上述方法很差。这是我继承的代码,不幸的是我不能改变当前的结构(即有一个ParentView暴露出一个暴露ChildControl的ParentControl),所以,我正在寻找关于如何以这样的方式执行此操作的想法ChildControl中MenuItem的Command和CommandParameter属性可以绑定到ParentViewModel中的Command属性,以便ChildControl的DataContext实例作为Command的参数传递。

我正在尝试采用以下方法的示例:

    <UserControl.ContextMenu>
    <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
        <MenuItem 
            Header="Add" 
            Command="{Binding Path=DataContext.AddCommand, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" 
            CommandParameter="{Binding Path=DataContext.DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" />
    </ContextMenu>
</UserControl.ContextMenu>

谢谢!

1 个答案:

答案 0 :(得分:0)

现在你没有提到MVVM,但我认为这就是你想要的。

每个视图都应该有一个ViewModel。 并且每个视图的viewModel应该被指定为视图datacontext。 这样,您就可以将命令或任何其他数据绑定到视图的viewModel。

从viewModel中,您可以处理应该发生的事情。

假设您有ParentView.DoSomeCrazyStuff(),并且想要从ChildView.TriggerSomeCrazyStuffCommand触发,您应该将命令绑定到childView上的按钮,并从childViewModel触发它。

您可以从ParentViewModel将ChildViewModel分配给ChildView.DataContext,并将ParentViewModel作为参数发送。