3 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
我找到了一個更簡單的解決方案。
在UserControl背后的代碼中:
NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this));

TA貢獻1735條經(jīng)驗 獲得超5個贊
正如其他人所說,'ContextMenu'不包含在可視樹中,'ElementName'綁定不起作用。如果在“DataTemplate”中未定義上下文菜單,則僅按接受的答案建議設(shè)置上下文菜單的“NameScope”。我通過使用類似于'ElementName'綁定的{x:Reference}標記擴展來解決這個問題,但繞過可視樹以不同方式解析綁定。我認為這比使用'PlacementTarget'更具可讀性。這是一個例子:
<Image Source="{Binding Image}">
<Image.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete"
Command="{Binding Source={x:Reference Name=Root}, Path=DataContext.RemoveImage}"
CommandParameter="{Binding}" />
</ContextMenu>
</Image.ContextMenu>
</Image>
根據(jù)MSDN文檔
x:Reference是在XAML 2009中定義的構(gòu)造。在WPF中,您可以使用XAML 2009功能,但僅適用于非WPF標記編譯的XAML。標記編譯的XAML和BAML形式的XAML目前不支持XAML 2009語言關(guān)鍵字和功能。
無論那意味著什么......但對我而言。

TA貢獻1793條經(jīng)驗 獲得超6個贊
這是另一個僅限xaml的解決方法。(這也假設(shè)你想要DataContext中的內(nèi)容,例如,你是MVVM的)
選項一,其中ContextMenu的父元素不在DataTemplate中:
Command="{Binding PlacementTarget.DataContext.MyCommand,
RelativeSource={RelativeSource AncestorType=ContextMenu}}"
這對OP的問題很有用。如果您在DataTemplate中,這將不起作用。在這些情況下,DataContext通常是集合中的眾多元素之一,并且您希望綁定的ICommand是同一ViewModel(例如Window 的DataContext)中集合的兄弟屬性。
在這些情況下,您可以利用Tag暫時保存包含集合和ICommand 的父DataContext:
class ViewModel
{
public ObservableCollection<Derp> Derps { get;set;}
public ICommand DeleteDerp {get; set;}
}
并在xaml
<!-- ItemsSource binds to Derps in the DataContext -->
<StackPanel
Tag="{Binding DataContext, ElementName=root}">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem
Header="Derp"
Command="{Binding PlacementTarget.Tag.DeleteDerp,
RelativeSource={RelativeSource
AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.DataContext,
RelativeSource={RelativeSource AncestorType=ContextMenu}}">
</MenuItem>
- 3 回答
- 0 關(guān)注
- 693 瀏覽
添加回答
舉報