У меня есть 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}}}"/>
Ни один из которых не вызвал событие.
Редактировать: Я, вероятно, должен добавить, что более важной целью является создание кнопки, которая при нажатии создает динамически заполненное контекстное меню. Я могу быть на совершенно неверном пути.