簡體   English   中英

訪問ContextMenu中的ViewModel / DataConext

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM