2

我有一个数据网格,我将 silverlight 4 工具包上下文菜单添加到数据网格中的文本框中,如下所示。当用户右键单击文本框时,将显示上下文菜单。当用户单击带有标题“Test”的菜单项时,“MenuItem_Click”正在执行。现在我想从 MenuItem_Click 访问文本框并修改其属性,如背景等。无论如何从 MenuItem_Click 事件中找到文本框元素(它是 contextmenu 的父级)?

在我看来,我错过了一些非常简单的东西。

<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
    <TextBox Text="{Binding AcctId}"
             Style="{StaticResource documentTextBoxStyle}"
             ToolTipService.ToolTip="Right Click to modify parameters" >
        <toolkit:ContextMenuService.ContextMenu >
            <toolkit:ContextMenu >
                <toolkit:MenuItem Header="Test" Click="MenuItem_Click"/>
            </toolkit:ContextMenu>
        </toolkit:ContextMenuService.ContextMenu>
    </TextBox>
</DataTemplate>

4

4 回答 4

4

真的不需要解决方法,它就像使用数据绑定一样简单:

(sender as MenuItem).DataContext as TextBox

会给你你所追求的文本框。(在 Tag 字段中存储东西真的不是你想让代码混乱的东西。)

于 2010-07-06T01:18:59.603 回答
0

我所能建议的就是给你的 MenuItem 一个带有它的父 TextBlock 名称的标签,如下所示: 编辑:无法弄清楚如何在 Xaml 中粘贴,但我相信你知道如何添加它。

然后在您的点击事件中,您会找到 TextBlock:

private void MenuItem_TextBlockClick(object sender, RoutedEventArgs e)
{
  MenuItem menuItem = (MenuItem)sender;
  TextBlock textBlock = this.FindName((string)menuItem.Tag) as TextBlock;
  /// do something
}

我发现的问题是 MenuItem 的父级是 ContextMenu,这很好。但是,一旦您尝试获取 ContextMenu 的父级,它就会崩溃。

于 2010-04-20T20:17:44.097 回答
0

虽然我没有找到解决方案,但我找到了一些解决方法

  1. 遍历可视化树并找出文本框
  2. 修改控制工具包源中的代码以将内部成员“所有者”公开为公共属性,其中包含对上下文菜单所有者的引用,在我的例子中是文本框。

我想知道为什么 SL 工具包的家伙让所有者成为内部而不是公开的。可能他们的想法是仅通过“ContextMenuService”管理“ContextMenu”,但不幸的是 ContextMenuService 没有给所有者。希望 SL 工具包的家伙能给我们提供一种方法来在未来的版本中获取上下文菜单的所有者。

于 2010-05-03T19:08:25.313 回答
0

我不确定这是否适用于 Silverlight,但我最近在 WPF 中遇到了类似的问题。如果您使用 ContextMenu 的 PlacementTarget 属性,它应该返回用于打开 ContextMenu 的元素。

于 2010-05-03T19:21:17.227 回答