我需要根据条件动态显示或隐藏其中一个数据网格列。
据我所知,列不存在于逻辑或可视数据网格树中,因此我决定将其替换为静态资源
我有什么
查看 (隐藏名称空间清除)
<UserControl Name="UserControl">
<UserControl.Resources>
<DataGridTemplateColumn x:Key="ProblemColumn"
Visibility="{Binding DataContext.IsDisplayed, Source={x:Reference UserControl}, Converter={StaticResource BooleanToVisibilityConverter}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="myModels:SomeModel">
<DataGrid ItemsSource="{Binding SomeViewModel}">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="myModels:AnotherModel">
<Border>
<TextBlock Text="{Binding Text}"
VerticalAlignment="Center"
HorizontalAlignment="Right"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</UserControl.Resources>
<Grid>
<ScrollViewer>
<DataGrid ItemsSource="{Binding AnotherItems}">
<DataGrid.Columns >
<DataGridTemplateColumn>
...
</DataGridTemplateColumn>
<StaticResource ResourceKey="ProblemColumn"/>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</Grid>
视图模型 只有我的属性,我明确设置隐藏列
的值public bool IsDisplayed => false;
所以现在属性正确绑定并返回值,但UI上没有任何更改,列仍然存在于datagrid中,即使property的值设置为false,我也可以看到它。
我能错过什么?
答案 0 :(得分:1)
您可以通过删除后面代码中的特定列来隐藏它。
<Grid Loaded="OnGridLoaded">
<ScrollViewer>
<DataGrid ItemsSource="{Binding AnotherItems}" x:Name="MyDataGrid">
<DataGrid.Columns >
<DataGridTemplateColumn x:Name="MyColumn">
...
</DataGridTemplateColumn>
<StaticResource ResourceKey="ProblemColumn"/>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</Grid>
后面的代码:
private void OnGridLoaded(object sender, RoutedEventArgs e)
{
var vm = (sender as Grid)?.DataContext as FooVm;
if ((vm != null)
&& (vm.IsDisplayed == false))
{
MyDataGrid.Columns.Remove(MyColumn);
}
}