2011-09-29 57 views
7

我試圖將MenuItem的命令綁定到包含在UserControl.DataContext中的命令。我發現,根據他們夫婦類似的問題,但解決方案未能對我說:在DataTemplate中綁定到父DataContext

<UserControl ...> 
<UserControl.Resources> 
    <DataTemplate x:Key="TileItemStye"> 
     <Grid Width="100" Height="100"> 
      <Grid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Remove" 
           Command="{Binding DataContext.RemoveItem, 
           RelativeSource={RelativeSource FindAncestor, 
              AncestorType=UserControl}}"> 
        </MenuItem> 
       </ContextMenu> 
      </Grid.ContextMenu> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <ListView ItemsSource="{Binding Path=Files}" 
       ItemTemplate="{DynamicResource TileItemStye}" > 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 
</Grid> 

用戶控件的DataContext的是視圖模型與ICommand的removeItem和ObservableCollection<FileViewModel>文件。

+0

什麼是「不能」你? - 請解釋你得到的錯誤.... – Carsten

+0

命令沒有被綁定...我沒有得到任何錯誤,只是綁定到命令的處理程序永遠不會被調用 – bkovacic

+1

我認爲Datacontext應該「下雨」到你的模板,你嘗試命令=「{綁定路徑= RemoveItem}」? – hyp

回答

13

如果你是在.NET 4確實有一個更優雅的解決方案:

<UserControl Name="uc" ...> 
<!-- ... --> 
    <MenuItem Header="Remove" 
       Command="{Binding DataContext.RemoveItem, 
           Source={x:Reference uc}}"/> 

(這需要個在模板停留在資源中,否則會出現週期性依賴錯誤)

+0

你能詳細說明依賴性錯誤嗎?我有一個類似的情況,我使用ElementName = LayoutRoot來訪問DataContext(我的ViewModel)。但它泄漏了視圖模型。這是你說的循環依賴錯誤嗎?有什麼辦法解決這個問題? (windows store app btw) –

+0

@JorisWeimar:如果你從樹中引用一個控件,例如'x:Reference',依賴錯誤只會發生。如果一個'Grid'包含一個'TextBlock',並且你試圖在'TextBlock'的一個綁定中引用'Grid',這會導致這樣的錯誤。我只在這裏使用'x:Reference',因爲'ElementName'在斷開連接的樹的上下文中不起作用。關於你的問題,我不明白「泄漏視角模型」應該是什麼意思。 –

+0

與泄漏viewmodel我的意思是viewmodel沒有最終確定,因爲有一個從COM層內(我從PerfView收集)的地方有一個refence。幾乎看起來這是這類建築的固有問題。 –

4

菜單不會在同一個Visual樹爲您的控制,這是得出爲什麼的RelativeSource綁定不起作用

您需要綁定到你的ContextMenuPlacementTarget進入主視覺樹

<MenuItem Header="Remove" 
      Command="{Binding PlacementTarget.DataContext.RemoveItem, 
       RelativeSource={RelativeSource FindAncestor, 
       AncestorType={x:Type ContextMenu}}}" /> 
+0

嗯...我仍然無法調用命令。我明白你的意思,但綁定不起作用。 – bkovacic

+0

@Pedala我可能有語法錯誤。我知道你想綁定到'PlacementTarget',它應該返回附加'ContextMenu'的控件,但是你可能需要使用不同的語法來導航命令。 – Rachel

+0

你寫的綁定上到網格在DataTemplate內),但不能達到UserControl的DataContext(其中的命令是)。這是問題是否可以嵌套綁定,所以我可以從這個網格上升? – bkovacic

相關問題