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);
主要问题是我的资源正在创建一个新的视图模型,所以它没有调用/影响我的视图所依赖的VM实例。为了解决这个问题,我需要设置ContextMenu
父控件(这是一个网格)的DataContext
如下所示:
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyType}}}
如果你只是调用下面的it 将创建一个新的ViewModel实例并使用它:
<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" />