[英]Access ViewModel / DataConext inside ContextMenu
如何在ContextMenu中獲取UserControl的原始DataContext。
下面的代碼,你可以看到DataTemplate中有一個Button,它正確綁定。 但是,在嘗試綁定contextmenu的數據源時,我收到以下錯誤:
System.Windows.Data錯誤:4:無法找到綁定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.TreeView',AncestorLevel ='1''。 BindingExpression:路徑= DataContext的; 的DataItem = NULL; target元素是'ContextMenu'(Name =''); target屬性是'DataContext'(類型'Object')
我需要做什么才能讓ContextMenu綁定到ViewModel?
================================================== =============================
ViewModel被分配給代碼隱藏中視圖的datacontext:
視圖:
<TreeView ItemsSource="{Binding Clients}"
cmd:TreeViewSelect.Command="{Binding SelectionChangedCommand}"
cmd:TreeViewSelect.CommandParameter="{Binding RelativeSource={RelativeSource Self},Path=SelectedItem}">
<TreeView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding DataContext,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}">
<MenuItem Header="{Binding TestString}" />
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
<Button DataContext="{Binding DataContext,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}"
Content="{Binding TestString}" Command="{Binding EditSelectedClientCommand}" />
</StackPanel>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
視圖模型:
public class ClientListViewModel : ViewModelBase
{
public String TestString {
get {
return "TESTING";
}
}
private ClientList _clients = null;
private readonly IClientService _clientService = null;
private readonly IEventAggregator _eventAggregator = null;
private Client _selectedClient = null;
private ICommand _selectionChangedCommand = null;
private ICommand _editSelectedClientCommand = null;
....
}
ContextMenus
沒有出現在導致RelativeSource綁定失敗的可視化樹中,您仍然可以以某種方式獲取DataContext
。 你可以試試這個例子:
<TextBlock Text="{Binding Name}"
Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=TreeView}}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<MenuItem Header="{Binding TestString}" />
<!-- ... --->
PlacementTarget
是TextBlock, DataContext
通過Tag
隧道傳輸。 只有一種方法可以做到這一點(至少我希望它有效),我也看到一些圖書館以不同的方式彌合這個差距,但我不記得它們的起源......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.