首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DataGrid头中的按钮绑定到ViewModel

将DataGrid头中的按钮绑定到ViewModel
EN

Stack Overflow用户
提问于 2018-04-25 08:13:20
回答 1查看 911关注 0票数 0

我有一个DataGrid,它绑定到我的ViewModel中的ICollectionView "Employees“,我想对每一列进行筛选。

以下是XAML的样子:

代码语言:javascript
复制
<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看起来是这样的:

代码语言:javascript
复制
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事件?

我试过:

代码语言:javascript
复制
<Button Content="v" Grid.Column="1" Command="{Binding FilterMenu}"/>

还包括:

代码语言:javascript
复制
<Button Content="v" Grid.Column="1" Command="{Binding FilterMenu, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>

所有这些都没有触发事件。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-25 09:00:12

我不遵循您对更大目标和动态填充上下文菜单的描述。

这听起来好像会有它自己的一组更具挑战性的问题,在窗口中获取对任何数据文本的引用。contextmenu通常依赖于布局目标来获取上下文,因为它不是窗口的一部分。

如果您打算从那里传递命令,那么很可能会变得非常复杂。

但是..。这是一个完全不同的问题。

将按钮绑定到数据集的数据文本中的命令。

我的数据被称为dg (我在内心是一个极简主义者)。

我的命令有点冗长,叫做ColHeaderCommand。

这对我来说很管用:

代码语言:javascript
复制
<DataGridTextColumn.Header>
    <Button Content="Title" Command="{Binding DataContext.ColHeaderCommand, ElementName=dg}"/>
</DataGridTextColumn.Header>

我的视图模型是窗口的数据文本,它被继承到datagrid。

您将希望为该命令提供某种参数,以传递您要使用的列或任何操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50017196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档