Silverlight 4: Как найти исходный элемент пользовательского интерфейса в menuitem_click контекстного меню? - PullRequest
2 голосов
/ 20 апреля 2010

У меня есть сетка данных, и я добавил контекстное меню набора инструментов silverlight 4 в текстовое поле в сетке данных следующим образом. Когда пользователи щелкают правой кнопкой мыши на текстовом поле, отображается контекстное меню. Когда пользователи щелкают по пункту меню с заголовком «Тест», «MenuItem_Click» выполняется. Теперь я хочу получить доступ к текстовому полю из MenuItem_Click и изменить его свойства, такие как фон и т. Д. Есть ли в любом случае найти элемент textbox (который является родительским контекстом) из события MenuItem_Click?

Мне кажется, что я упускаю что-то очень простое.

<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 голосов
/ 06 июля 2010

Обходной путь действительно не требуется, это так же просто, как использовать привязку данных:

(sender as MenuItem).DataContext as TextBox

Даст вам TextBox, который вам нужен. (Хранение содержимого в поле Tag - это не то, чем вы хотите загромождать свой код.)

0 голосов
/ 03 мая 2010

Хотя я не нашел решения для этого, я нашел несколько обходных путей

  1. Пройдите по визуальному дереву и найдите текстовое поле
  2. Измените код в источниках набора инструментов управления, чтобы внутренний элемент «Владелец» был представлен как открытое свойство, которое содержит ссылку на владельца контекстного меню, в моем случае - текстового поля.

Интересно, почему ребята из инструментария SL сделали владельца внутренним, а не публичным. Вероятно, их идея состоит в том, чтобы управлять «ContextMenu» только через «ContextMenuService», но, к сожалению, ContextMenuService не дает Владельцу. Надеюсь, ребята из SL инструментария дадут нам возможность получить владельца контекстного меню в будущих выпусках.

0 голосов
/ 03 мая 2010

Я не уверен, работает ли это в Silverlight, но у меня недавно была похожая проблема с WPF. Если вы используете свойство ContextMenu PlacementTarget, оно должно вернуть элемент, который использовался для открытия ContextMenu.

0 голосов
/ 21 апреля 2010

Все, что я могу предложить, это дать вашему 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, что нормально. Но как только вы пытаетесь получить Parent of the ContextMenu, он просто падает.

...