2

データグリッドがあり、次のようにデータグリッドのテキスト ボックスに Silverlight 4 ツールキットのコンテキスト メニューを追加しました。ユーザーがテキスト ボックスを右クリックすると、コンテキスト メニューが表示されます。ユーザーがヘッダー「Test」のメニュー項目をクリックすると、「MenuItem_Click」が実行されます。MenuItem_Click からテキストボックスにアクセスし、背景などのプロパティを変更したいのですが、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 に答える 4

4

回避策は本当に必要ありません。データバインディングを使用するのと同じくらい簡単です。

(sender as MenuItem).DataContext as TextBox

あなたが求めている TextBox を提供します。(Tag フィールドに何かを格納することは、実際にはコードを乱雑にしたいものではありません。)

于 2010-07-06T01:18:59.603 に答える
0

これに対する解決策は見つかりませんでしたが、いくつかの回避策を見つけました

  1. ビジュアルツリーをトラバースして、テキストボックスを見つけます
  2. コントロールツールキットソースのコードを変更して、内部メンバー'Owner'を、コンテキストメニューの所有者(私の場合はテキストボックス)への参照を含むパブリックプロパティとして公開します。

SLツールキットの連中が所有者を公開ではなく内部にしたのはなぜだろうか。おそらく彼らのアイデアは「ContextMenuService」を介してのみ「ContextMenu」を管理することですが、残念ながらContextMenuServiceは所有者を提供しません。うまくいけば、SLツールキットの人たちは、将来のリリースでコンテキストメニューの所有者を取得する方法を提供してくれるでしょう。

于 2010-05-03T19:08:25.313 に答える
0

これが Silverlight で機能するかどうかはわかりませんが、最近 WPF で同様の問題が発生しました。ContextMenu の PlacementTarget プロパティを使用する場合、ContextMenu を開くために使用された要素を返す必要があります。

于 2010-05-03T19:21:17.227 に答える
0

私が提案できるのは、次のような親の TextBlock 名を持つタグを MenuItem に与えること だけです。

次に、クリック イベントで 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 に答える