Используйте Window DataContext в дочернем элементе после переопределения DataContext в родительском элементе - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть модель представления, которая содержит коллекцию объектов и набор команд.

public class MainWindowVM : NotifyPropertyChangedBase
{
    private CollectionViewSource employeeViewSource;

    private ICommand cmdOpenDetailEmployee;

    public MainWindowVM()
    {
        nsDataProviderEmployees = new NSDataProvider();

        employeeViewSource = new CollectionViewSource();

        cmdOpenDetailEmployee = new RelayCommand<object>((parameter) => {...});

        this.LoadData();
    }

    public CollectionViewSource EmployeeViewSource => employeeViewSource;
    public ICommand CmdOpenDetailEmployee => cmdOpenDetailEmployee;
}

В моем приложении я хочу использовать эту команду в контекстном меню таблицы данных, показывающей сотрудников.

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp.UI"
        xmlns:DataModel="clr-namespace:MyApp.DataModel;assembly=MyApp.DataModel" x:Class="MyApp.UI.MainWindow"
        xmlns:vm="clr-namespace:MyApp.UI.ViewModels"
        mc:Ignorable="d"
        Title="MyApp - Main" Height="751.826" Width="1111.005" Loaded="Window_Loaded" Icon="Resources/MyApp.ico">
    <Window.DataContext>
        <vm:MainWindowVM />
    </Window.DataContext>
    <Grid x:Name="grdMain">
        <DataGrid DataContext="{Binding Path=EmployeeViewSource}" x:Name="employeeDataGrid" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="10,77,10,0" RowDetailsVisibilityMode="VisibleWhenSelected">
            <DataGrid.ContextMenu>
                <ContextMenu DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}">
                    <MenuItem Header="OpenDetail..."
                              Command="{Binding CmdOpenDetailEmployee}"
                              CommandParameter="{Binding}"/>
                </ContextMenu>
            </DataGrid.ContextMenu>
            <DataGrid.Columns>...</DataGrid.Columns>

        </DataGrid>
    </Grid>
</Window>

Проблема в Я не могу найти комбинацию привязок, которые позволяют мне использовать свойство EmployeeViewSource или мой ViewModel в качестве DataContext для сетки И свойство CmdOpenDetailEmployee моей ViewModel как DataContext для моих ContextMenu и MenuItems.

Согласно всем сообщениям, которые я смог найти, это должно работать, но команда не выполняется, когда я щелкаю по пункту меню.

1 Ответ

0 голосов
/ 13 ноября 2018

Свяжите с DataContext из PlacementTarget из ContextMenu, и пусть DataGrid наследует его DataContext из окна:

<DataGrid x:Name="employeeDataGrid" 
        EnableRowVirtualization="True"
        ItemsSource="{Binding EmployeeViewSource.View}" Margin="10,77,10,0" 
        RowDetailsVisibilityMode="VisibleWhenSelected">
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="OpenDetail..."
                              Command="{Binding PlacementTarget.DataContext.CmdOpenDetailEmployee, 
                                    RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                              CommandParameter="{Binding}"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
    <!--<DataGrid.Columns>...</DataGrid.Columns>-->
</DataGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...