2011-09-29 90 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

相关问题