【发布时间】:2015-03-05 14:59:37
【问题描述】:
我有一个UserControl,里面有一个DataGrid。我将DataGrid 的列创建为DataGridTemplateColumns。 DataGrid 看起来像:
<DataGrid Grid.Row="1" Style="{StaticResource DataGridStyle}" Margin="5"
ItemsSource="{Binding Storage.Items, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
MaxHeight="400" VerticalAlignment="Top">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Comment" Width="*" SortMemberPath="Comment">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Comment}" Margin="3,2" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
// several more column-definitions
<DataGridTemplateColumn Header="Actions" Width="90">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Margin="5" Content="Action..." Cursor="Hand" >
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<TextBlock TextDecorations="Underline" HorizontalAlignment="Center" Foreground="Blue">
<ContentPresenter/>
</TextBlock>
</ControlTemplate>
</Button.Template>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<EventTrigger RoutedEvent="Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Edit"/>
<MenuItem Header="Delete" Command="{Binding DataContext.CommonCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
CommandParameter="{x:Static defs:CommonCommandTarget.Delete}"/>
<Separator/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>+
</DataGrid.Columns>
</DataGrid>
我的问题是最后一列中 ContextMenu 的 Delete-Command 绑定。显示上下文菜单,但单击时没有任何反应。
在输出中我可以看到一个绑定错误:
System.Windows.Data 错误:4:找不到绑定源 参考'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid',AncestorLevel='1''。 BindingExpression:Path=DataContext.CommonCommand;数据项=空; 目标元素是'MenuItem'(名称='');目标属性是“命令” (输入“ICommand”)
直接在模板列中的DataGrid 或Button 之外可以很好地使用绑定。所以命令是正确的。
Ancestor 或 RelativeSource 或我必须提供什么才能调用 ViewModel 中的命令?
【问题讨论】: