2015-12-14 57 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作爲參數。