我已经使用AutoGenerateColumns = true
从DataTable在WPF中创建了一个DataGrid。在VM中,我有一个命令属性,用于添加和删除操作底层DataTable的列。
当我通过AddColumn
从主XAML窗口调用Command="{Binding AddColumn}"
时,它按预期工作但当我从具有上下文菜单的资源文件调用RemoveColumn时,它调用命令属性(我能够步骤)通过代码)但不更新网格。
<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" CommandParameter="{Binding}" />
我现在更新了两个命令,只将DataTable设置为null,即Dt = null
,对于AddColumn,它按预期工作并删除了Grid和列,但对于RemoveColumn,它什么也没做......我也看不到关于绑定的输出窗口中的错误以及在调试属性时调用该属性的错误。我还尝试将列设置为不可见,但也无效。
更新
我从资源文件中的以下(简化)代码调用DeleteColumn。
<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);
答案 0 :(得分:0)
主要问题是我的资源是创建一个新的viewmodel,因此它没有调用/影响我的视图所依赖的VM实例。要解决这个问题,我需要设置DataContext
父控件的ContextMenu
(这是一个网格),如下所示:
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyType}}}
如果您只是调用以下内容,将创建ViewModel的新实例并使用它:
<MenuItem Header="Delete" Command="{Binding Source={StaticResource AppViewModel}, Path=DeleteColumn}" />