2015-12-14 80 views
-1

我重构具有以下结构中的一些遗留WPF代码 -CommandParameter绑定(从嵌套的子控制到家长控制)

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暴露了一个ParentControl暴露了一个ChildControl),所以,我正在寻找关于如何做到这一点的想法,使命令和ChildControl中的MenuItem上的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

你可以发布一些你正在使用的代码吗? – ProgrammingDude

+0

刚刚编辑我的问题,包括一个代码示例。 – Chris

+0

@Chris当文字很大时,尝试用一个注释良好的图像来描述你的问题。 – AnjumSKhan

回答

0

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

每个视图都应该有一个ViewModel。 并且每个视图的viewModel应该被分配为视图datacontext。 通过这种方式,您可以将您的命令或任何其他数据绑定到视图的视图模型。

从你的viewModel你可以处理应该发生的事情。假设你有ParentView.DoSomeCrazyStuff(),并且你想从你的ChildView.TriggerSomeCrazyStuffCommand中触发它,你应该将你的命令绑定到你的childView上的一个按钮,并从childViewModel触发它。

而你可以从你的ParentViewModel分配ChildViewModel到ChildView.DataContext,并发送ParentViewModel作为参数。