根据条件隐藏数据网格中的列

时间:2018-06-16 18:50:27

标签: c# .net wpf xaml mvvm

我需要根据条件动态显示或隐藏其中一个数据网格列。

据我所知,列不存在于逻辑或可视数据网格树中,因此我决定将其替换为静态资源

我有什么

查看 (隐藏名称空间清除)

<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,我也可以看到它。

我能错过什么?

1 个答案:

答案 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);        
    }    
}