我有一个DataGrid,它绑定到我的ViewModel中的ICollectionView "Employees“,我想对每一列进行筛选。
以下是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}}}"/>所有这些都没有触发事件。
编辑:我可能应该补充一下,更大的目标是创建一个按钮,当单击该按钮时,创建一个动态填充的上下文菜单。我可能在这完全走错了路。
发布于 2018-04-25 09:00:12
我不遵循您对更大目标和动态填充上下文菜单的描述。
这听起来好像会有它自己的一组更具挑战性的问题,在窗口中获取对任何数据文本的引用。contextmenu通常依赖于布局目标来获取上下文,因为它不是窗口的一部分。
如果您打算从那里传递命令,那么很可能会变得非常复杂。
但是..。这是一个完全不同的问题。
将按钮绑定到数据集的数据文本中的命令。
我的数据被称为dg (我在内心是一个极简主义者)。
我的命令有点冗长,叫做ColHeaderCommand。
这对我来说很管用:
<DataGridTextColumn.Header>
<Button Content="Title" Command="{Binding DataContext.ColHeaderCommand, ElementName=dg}"/>
</DataGridTextColumn.Header>我的视图模型是窗口的数据文本,它被继承到datagrid。
您将希望为该命令提供某种参数,以传递您要使用的列或任何操作。
https://stackoverflow.com/questions/50017196
复制相似问题