2017-02-26 38 views
0

我想通過命令參數在我的視圖後面的代碼中的依賴屬性發送由dp設置的屬性給我的viewmodel(通過datacontext綁定)。該屬性(ParentUserControl)似乎在進入時正確初始化,但是我似乎無法發送它。我已經試過下面代碼隱藏的綁定依賴屬性到CommandParameter

<DataGrid.ContextMenu> 
    <ContextMenu> 
     <MenuItem Command="{Binding CommandTest}" 
        CommandParameter="{Binding ParentUserControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyView}}}" /> 
    </ContextMenu> 
</DataGrid.ContextMenu> 

<ContextMenu> 
    <MenuItem Command="{Binding CommandTest}" 
       CommandParameter="{Binding ParentUserControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" /> 
</ContextMenu> 

兩個綁定我使用mvvmlight中繼命令如下所示然而在該方法中測試pased()的參數總是空

CommandTest = new RelayCommand<object>(x => test(x)); 

這是視圖後面的代碼中附加的依賴項屬性:

public static readonly DependencyProperty ParentUserControlProperty = DependencyProperty.Register(
    "ParentUserControl", typeof(UserControl), typeof(MyView), new PropertyMetadata(default(UserControl))); 

public UserControl ParentUserControl 
{ 
    get { return (UserControl) GetValue(ParentUserControlProperty); } 
    set { SetValue(ParentUserControlProperty, value); } 
} 
+0

'ContextMenu'打破了視覺樹,你可以用'PlacementTarget'來解決這個問題,就像[這裏]解釋的一樣(http://stackoverflow.com/questions/3668654/relativesource-binding-from-a-tooltip-or -上下文菜單)。 – bab7lon

+0

我不確定這是我在找什麼,命令已經綁定到viewmodel並且工作正常,它的命令參數我遇到了困難 –

+0

儘管我在CommandParameter上嘗試了它,但沒有運氣。 –

回答

0

你應該使用這樣的事情:

<DataGrid 
    Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type MyView}}}"> 
    <DataGrid.ContextMenu> 
     <ContextMenu> 
      <MenuItem Command="{Binding CommandTest}" 
       CommandParameter="{Binding PlacementTarget.Tag.ParentUserControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:ContextMenu}}}" /> 
     </ContextMenu> 
    </DataGrid.ContextMenu> 
</DataGrid> 

您綁定的標籤DataGridMyView。在MenuItem中,您爲ContextMenu使用它的PlacementTarget(它是DataGrid)及其Tag(它是MyView)。

+0

你的傳奇,完美的工作謝謝你! –

0

使用名稱的視圖,找到參數

CommandParameter="{Binding ElementName=MyViewName, Path=ParentUserControl}" 

另外添加一個虛擬的MyView其視圖模型的ParentUserControl結合(並檢查其是否在該級別的工作)。 我的意思是,嘗試創建視圖模型一個UserControl Parent特性,結合MyView的的相關性,然後嘗試

CommandParameter="{Binding ElementName=MyViewName, Path=DataContext.Parent}" 

在後一種情況下,因爲它已經在視圖模型,也許你甚至都不需要參數。順便說一句,從MVVM設計模式的角度來看,你不應該傳遞控制作爲參數傳遞給視圖模型...

+0

我也試過這個,但不幸的是它仍然通過null –

+0

對不起,我不明白你是什麼意思的虛擬綁定,你能解釋更多請。 –