Кнопка привязки в заголовке DataGrid к ViewModel - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть DataGrid, который связан с ICollectionView «Сотрудниками» в моем ViewModel, который я хочу отфильтровать для каждого столбца.
Вот как выглядит XAML:

<DataGrid ItemsSource="{Binding Employees}"
attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding EmployeeColumns}">
            <DataGrid.ColumnHeaderStyle>
                <Style TargetType="DataGridColumnHeader">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="16"/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="{Binding}" Grid.Column="0"/>
                                    <Button Content="v" Grid.Column="1" Click="ButtonClick"/>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGrid.ColumnHeaderStyle>
        </DataGrid>

Это работает нормально, и при вызове ButtonClick я мог бы передать контекст данных моему ViewModel и найти эту строку. Однако я предпочел бы привязать кнопку к событию в моем ViewModel, чтобы я мог получить ссылку на столбец, из которого произошло это событие, и соответствующим образом обработать мои данные там.

Мой ViewModel выглядит так:

class ViewModel : ChangeNotifier
{
    public ICollectionView Employees { get; private set; }

    public ViewModel()
    {
        var _employees = new List<Employee>{...
        Employees = CollectionViewSource.GetDefaultView(_employees);
        EmployeeColumns = new ObservableCollection<DataGridColumn>();
        EmployeeColumns.Add(new DataGridTextColumn { Header = "First Name", Binding = new Binding("FirstName") });
        EmployeeColumns.Add(new DataGridTextColumn { Header = "Last Name", Binding = new Binding("LastName") });

        FilterMenu = new RelayCommand(new Action<object>(FilterContextMenu));
    }
    private ICommand filtermenu;
    public ICommand FilterMenu
    {
        get
        {
            return filtermenu;
        }
        set
        {
            filtermenu = value;
        }
    }
    public static void FilterContextMenu(object obj)
    {
        MessageBox.Show("Event Fired!");
    }

    public ObservableCollection<DataGridColumn> EmployeeColumns { get; private set; }
}

Итак, мой вопрос: как мне привязаться к событию FilterContextMenu?

Я пробовал:

<Button Content="v" Grid.Column="1" Command="{Binding FilterMenu}"/>

А также:

<Button Content="v" Grid.Column="1" Command="{Binding FilterMenu, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>

Ни один из которых не вызвал событие.

Редактировать: Я, вероятно, должен добавить, что более важной целью является создание кнопки, которая при нажатии создает динамически заполненное контекстное меню. Я могу быть на совершенно неверном пути.

1 Ответ

0 голосов
/ 25 апреля 2018

Я не слежу за вашим описанием большой цели и динамически заполненного контекстного меню.

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

Но ... это совсем другой вопрос.
Привязка кнопки к команде, которая находится в текстовом тексте сетки данных.
Моя таблица данных называется dg (я в душе минималист).
Я получил немного многословно с моей командой, и она называется ColHeaderCommand.

Это работает для меня:

<DataGridTextColumn.Header>
    <Button Content="Title" Command="{Binding DataContext.ColHeaderCommand, ElementName=dg}"/>
</DataGridTextColumn.Header>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...