Хорошо, вот ключевой код для того, что я в итоге сделал.Имейте в виду, я никогда не понимал, как получить тот же самый ответ, через код, из кнопки, как если бы я щелкнул по ней правой кнопкой мыши, но я действительно запустил свое контекстное меню в нужном месте.Я фактически изменил класс на класс, производный от TextBlock, в отличие от Button, и использовал метод PreviewMouseLeftButtonUp вместо метода Click:
public class LeftClickTextBlock : TextBlock
{
public LeftClickTextBlock()
{
this.PreviewMouseLeftButtonUp += this.LeftClickTextBlock_PreviewMouseLeftButtonUp;
}
private void LeftClickTextBlock_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs e)
{
LeftClickTextBlock lcb = sender as LeftClickTextBlock;
ContextMenu contextMenu = lcb.ContextMenu;
contextMenu.PlacementTarget = lcb;
contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
contextMenu.IsOpen = true;
}
}
И затем, конечно, для этого потребовались слегка скорректированные стили:
<Style x:Key="MyContextMenuTextBlock" TargetType="{x:Type view:LeftClickTextBlock)">
<Setter Property="ContextMenuService.Placement" Value="Bottom"/>
<Setter Property="ContextMenu" Value"{StaticResource MyContextMenu}"/>
</Style>
Это было в конечном итоге помещено в шаблон данных, который позволяет мне контролировать не только тип контекстного меню, которое появляется при нажатии на отдельный элемент сетки данных, но также и то, какой объект уровня модели представления контекстного менюпункты меню связаны с.Я не буду публиковать здесь весь код, но я думаю о том, чтобы опубликовать его где-нибудь, потому что он действительно дает полный контроль над моделью для каждой ячейки и привязки в сетке данных.
Опять же, определено в ResourceDictionaryили в приложении. xaml:
<DataTemplate DataType={x:Type viewModel:DataItem}>
<view:LeftClickTextBlock
Background="Transparent"
Style="{StaticResource MyContextMenuTextBlock}"
Text="{Binding Path=DataString, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>