将DataGrid标头中的Button绑定到ViewModel

时间:2018-04-25 08:13:21

标签: c# wpf mvvm datagrid

我有<configuration> <system.web> <httpRuntime requestValidationMode="4.5"/> </system.web> </configuration> 绑定到DataGrid&#34;员工&#34;在我的ICollectionView中,我想为每列过滤。
这就是XAML的样子:

ViewModel

这很好用,在调用<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}"/>

没有一个触发此事件。

编辑:我可能应该补充一点,更大的目标是创建一个按钮,单击该按钮可创建动态填充的上下文菜单。我可能在这里走错了路。

1 个答案:

答案 0 :(得分:1)

我没有按照您对更大目标和动态填充的上下文菜单的描述。

听起来它会让自己拥有一套更具挑战性的问题来获取对窗口中任何datacontext的引用。 contextmenu通常依赖于放置目标来获取任何上下文,因为它不是窗口的一部分 如果你打算从那里传递命令那么这可能会变得非常复杂。

但是......这完全是另一个问题 将按钮绑定到datagrid的datacontext中的命令 我的数据网格叫做dg(我心里很简约) 我的命令有点罗嗦,它叫做ColHeaderCommand。

这对我有用:

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

我的viewmodel是窗口的datacontext,它继承到datagrid 您将需要某种参数来传递该命令以传入哪个列或您正在做的任何事情。