2010-04-20 34 views
2

我有一個數據網格,並且我將silverlight 4工具包contextmenu添加到datagrid中的文本框中,如下所示。當用戶右鍵單擊文本框時,正在顯示contextmenu。當用戶點擊標題爲「測試」的菜單項時,「MenuItem_Click」正在執行。現在我想從MenuItem_Click訪問文本框,並修改其背景等屬性。無論如何,從MenuItem_Click事件找到文本框元素(這是contextmenu的父母)?Silverlight 4:如何從contextmenu的menuitem_click中找到源UI元素?

在我看來,我很想念一件非常簡單的事情。

<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> 

+0

問題似乎是ContextMenu不是VisualTree中TextBox的子項,這意味着你甚至無法搜索在代碼中就是這樣。我希望有人回答這個問題。 – 2010-05-03 17:37:59

回答

4

確實沒有需要有一個解決方法,這是因爲使用數據綁定一樣簡單:

(sender as MenuItem).DataContext as TextBox 

會給你你所追求文本框。 (在Tag域中存儲東西實際上並不是你想要混淆的代碼。)

+0

的頂部找到Canvas,如上所述,DataContext屬性會爲您提供項目源而不是TextBox – daniel 2013-07-15 02:22:47

0

所有我可以建議在給你的菜單項與它標記的父母的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 
} 

我發現是菜單項的父問題是文本菜單,這是罰款。但是,一旦你嘗試獲取ContextMenu的Parent,它就會崩潰。

+0

如果我們給文本框一個名字,我們是否會有很多具有相同名稱的文本框,因爲文本框在數據模板中? – funwithcoding 2010-04-20 20:23:07

0

雖然我沒有找到解決這個問題,我發現了幾個解決的

  1. 特拉弗斯可視樹和findout文本框
  2. 修改控件工具包源代碼並暴露出內部成員「業主'作爲公共財產,其中包含對上下文菜單的所有者的引用,在我的情況下是文本框。

我想知道爲什麼SL工具包的所有者讓所有者在內部不公開。可能他們的想法是僅通過'ContextMenuService'來管理'ContextMenu',但不幸的是ContextMenuService不會給所有者。希望SL工具包人員會給我們一種在未來版本中獲取上下文菜單的所有者的方法。

+0

我認爲第二個解決方法比第一個更清晰,但需要修改控制工具包的源代碼並編譯生成要包含在項目中的dll。 – funwithcoding 2010-05-03 19:12:52

+0

你如何遍歷視覺樹?如果您在MenuItem中使用數據綁定,則只能在MenuItem – daniel 2013-07-15 02:23:52

0

我不確定這是否適用於Silverlight,但我最近也遇到過與WPF類似的問題。如果使用ContextMenu的PlacementTarget屬性,它應該返回用於打開ContextMenu的元素。

相關問題