WPF数据网格删除列

本文关键字:删除列 网格 数据网 数据 WPF | 更新日期: 2023-09-27 17:54:41

我从AutoGenerateColumns = true的数据表中创建了WPF中的数据网格。在VM中,我有一个用于添加和删除操作底层DataTable的列的命令属性。

当我通过Command="{Binding AddColumn}"从主XAML窗口调用AddColumn时,它按预期工作,但当我从带有上下文菜单的资源文件调用RemoveColumn时,它调用命令属性(我能够通过代码步进),但不更新网格。

<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" CommandParameter="{Binding}" />

我现在更新了这两个命令,只将DataTable设置为null,即Dt = null和AddColumn这按预期工作,并删除了网格和列,但对于removecoluml它什么也不做……在输出窗口中,我也没有看到绑定方面的错误,也没有看到在逐步执行代码时调用属性的错误。我也试过将列设置为不可见,但也不起作用。

我从资源文件中的以下(简化)代码中调用deletecoluml。

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Content, ConverterParameter=*, Converter={StaticResource AfterDashConverter}, RelativeSource={RelativeSource self}}" Value="Green">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                        <Grid>
                            <Grid.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" />
                                </ContextMenu>
                            </Grid.ContextMenu>
                            <DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False"/>
                            <ItemsPresenter/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

命令非常简单,AddColumn直接在我的主视图中工作,而DeleteColumn不像在上面的资源文件中那样工作。我已经检查了命令是否正确。

    AddColumn = new RelayCommand(_ =>
    {
        Dt = null;
    }, true);
    DeleteColumn = new RelayCommand(column =>
    {
        Dt = null;
    }, true);

WPF数据网格删除列

主要问题是我的资源正在创建一个新的视图模型,所以它没有调用/影响我的视图所依赖的VM实例。为了解决这个问题,我需要设置ContextMenu父控件(这是一个网格)的DataContext如下所示:

DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyType}}}

如果你只是调用下面的it 创建一个新的ViewModel实例并使用它:

<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" />