WPF DataGridTextColumn显示隐藏Binding

先定义一个数据代理: 

  public class BindingProxy : Freezable
    {
        protected override Freezable CreateInstanceCore() => new BindingProxy();

        public object Data
        {
            get => GetValue(DataProperty);
            set => SetValue(DataProperty, value);
        }

        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
    }

Xaml中的写法:

<DataGrid x:Name="gridList"  ItemsSource="{Binding ListDataSource}"  CanUserSortColumns="False"
                         Height="{Binding ActualHeight, ElementName=mCanvas}"
                          CanUserAddRows="False"  AutoGenerateColumns="False"  HeadersVisibility="Column">
                <DataGrid.Resources>
                    <ulitiy:BindingProxy x:Key="DataContextProxy"  Data="{Binding}"/>
                </DataGrid.Resources>              
                <DataGrid.Columns>    
                    <DataGridTextColumn Visibility="{Binding Data.IsListViewMode, Source={StaticResource DataContextProxy},  Converter={StaticResource boolToVisibleCvt}}" 
                                        Binding="{Binding CreateByName}" Width="130" IsReadOnly="True"   Header="创建人" ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}"/>
                    <DataGridTemplateColumn Width="auto">                      
                        <DataGridTemplateColumn.Header>
                            <TextBlock Text="操作"  TextAlignment="Center"/>
                        </DataGridTemplateColumn.Header>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Button HorizontalAlignment="Left" Visibility="{Binding Data.IsListViewMode, Source={StaticResource DataContextProxy},  Converter={StaticResource boolToVisibleCvt}}"  Style="{StaticResource MaterialDesignFlatButton}" 
                                            Command="{Binding DataContext.DeleteCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"  CommandParameter="{Binding .}">
                                        <StackPanel Orientation="Horizontal">
                                            <materialDesign:PackIcon Kind="DeleteOutline" Width="26" Height="26" Margin="0 0 5 0"/>
                                            <TextBlock Text="删除" VerticalAlignment="Center" FontSize="16px"/>
                                        </StackPanel>
                                    </Button>

                                    <Button HorizontalAlignment="Left" Visibility="{Binding DataContext.IsListViewMode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Converter={StaticResource boolToVisibleCvt}, ConverterParameter=true}" 
                                            Style="{StaticResource MaterialDesignFlatButton}" Command="{Binding DataContext.DeleteCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"  CommandParameter="{Binding .}">
                                        <StackPanel Orientation="Horizontal">
                                            <materialDesign:PackIcon Kind="CheckBold" Foreground="Green" Width="26" Height="26" Margin="0 0 5 0"/>
                                            <TextBlock Text="确认选择" Foreground="Green" VerticalAlignment="Center" FontSize="16px"/>
                                        </StackPanel>
                                    </Button>
                                </StackPanel>
                              
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

如上所示:模板列里内容的显示和隐藏 有一个写法绑定到父亲UserControl的 DataContext 的 IsListViewMode属性,但同样的写法应用到 第一列不会生效。此时使用数据代理的模式则可正常显示或隐藏。

百度得来分析原因:DataGridTextColumn不在Virsual Tree中,不能继承UserControl的DataContext,而模板列渲染后存在于可视化树结构中(为何可以使用数据代理呢?暂时未知原因)。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值