当前位置: 首页 > news >正文

【笔记】WPF中如何的动态设置DataGridTextColumn是否显示

要动态控制 DataGridTextColumn 是否显示,不能用普通触发器或直接绑定,因为列不在可视树中。做法是:

  • 给列挂“可绑定的可见性”附加属性;
  • 用绑定把该属性连到一个状态值(如 ViewModel 的 SelectedTabItemData.State 或当前选中行的 State);
  • 用转换器把状态转成 Visible/Collapsed。

示例:

<UserControl x:Class="H.Sxb.Modules.Bill.View.OrderBillControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:b="http://schemas.microsoft.com/xaml/behaviors"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:H.Sxb.Modules.Bill.View"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"><UserControl.Resources><local:IntInSetToVisibilityConverter x:Key="IntInSetToVisibilityConverter" /><local:BindingProxy x:Key="dgProxy" Data="{Binding}" /></UserControl.Resources><!-- ... --><DataGrid x:Name="dg"ItemsSource="{Binding PageResponse.Items}"><DataGrid.Columns><!-- 顶部表格:当 State 为 1/2/3 显示“实发金额”,为 2/3 显示“收货金额” --><DataGridTextColumn Binding="{Binding MinusAmount}"Header="实发金额"local:DataGridColumnExtensions.BindableVisibility="{Binding Data.SelectedTabItemData.State,Source={StaticResource dgProxy},Converter={StaticResource IntInSetToVisibilityConverter},ConverterParameter=1,2,3}" /><DataGridTextColumn Binding="{Binding ReceivableAmount}"Header="收获金额"local:DataGridColumnExtensions.BindableVisibility="{Binding Data.SelectedTabItemData.State,Source={StaticResource dgProxy},Converter={StaticResource IntInSetToVisibilityConverter},ConverterParameter=2,3}" /><!-- 其余列... --></DataGrid.Columns></DataGrid>
</UserControl>
  • IntInSetToVisibilityConverter
using System;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Data;namespace H.Sxb.Modules.Bill.View
{public class IntInSetToVisibilityConverter : IValueConverter{public bool Invert { get; set; }public object Convert(object value, Type targetType, object parameter, CultureInfo culture){var text = parameter?.ToString() ?? string.Empty;var set = text.Split(new[] { ' '}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray();var val = value?.ToString();var match = set.Any(s => string.Equals(s, val, StringComparison.OrdinalIgnoreCase));if (Invert) match = !match;return match ? Visibility.Visible : Visibility.Collapsed;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>Binding.DoNothing;}
}
  • DataGridColumnExtensions
using System.Windows;
using System.Windows.Controls;namespace H.Sxb.Modules.Bill.View
{public static class DataGridColumnExtensions{public static readonly DependencyProperty BindableVisibilityProperty =DependencyProperty.RegisterAttached("BindableVisibility",typeof(Visibility),typeof(DataGridColumnExtensions),new PropertyMetadata(Visibility.Visible, OnBindableVisibilityChanged));public static void SetBindableVisibility(DependencyObject obj, Visibility value) =>obj.SetValue(BindableVisibilityProperty, value);public static Visibility GetBindableVisibility(DependencyObject obj) =>(Visibility)obj.GetValue(BindableVisibilityProperty);private static void OnBindableVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){if (d is DataGridColumn column && e.NewValue is Visibility v)column.Visibility = v;}}
}
  • BindingProxy
using System.Windows;namespace H.Sxb.Modules.Bill.View
{// Freezable proxy to expose DataContext into places not in the visual tree (e.g., DataGridColumn)public class BindingProxy : Freezable{public object Data{get => GetValue(DataProperty);set => SetValue(DataProperty, value);}public static readonly DependencyProperty DataProperty =DependencyProperty.Register(nameof(Data), typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));protected override Freezable CreateInstanceCore() => new BindingProxy();}
}

要点

  • DataGridColumn 不在可视树,必须用附加属性设置列的 Visibility。请确保使用命名空间前缀:local:DataGridColumnExtensions.BindableVisibility。
  • 绑定源可用 BindingProxy 暴露的 DataContext(你已加 dgProxy,继续沿用即可)。
  • ConverterParameter 建议逗号分隔(1,2,3)。如果你的 IntInSetToVisibilityConverter 已实现空格分隔,也可保持空格。
  • 若需“按行”显示/隐藏,请改用 DataGridTemplateColumn,在 CellTemplate 内用 DataTrigger 控制单元内容的 Visibility。

了解更多

DataGridColumn

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

http://www.dtcms.com/a/465215.html

相关文章:

  • 告别手动复制,API助您完成电商数据获取数据分析店铺搬家
  • 软件工程的核心原理与实践
  • LeetCode 394. 字符串解码(Decode String)
  • Spring Bean耗时分析工具
  • 济南可信网站网站开发命名规范
  • 应用案例丨3D工业相机如何实现「焊接全工序守护」
  • 网站接广告网站可以叫做系统吗
  • 应用层协议之Telnet协议
  • 科技赋能成长,小康AI家庭医生守护童真
  • 芯谷科技--D7005高效高压降压型DC-DC转换器
  • 玻尿酸:从天然分子到科技美学的全面解析
  • # 3.1.8<3.2.0<3.3.1,Apache DolphinScheduler集群升级避坑指南
  • 微算法科技(NASDAQ:MLGO)基于任务迁移的弹性框架重塑动态扩缩容,赋能边缘智能计算
  • 卡盟网站怎么做图片wordpress换网址插件
  • 【汽车篇】基于深度学习的门盖自动装配系统:汽车制造装配的革新力量
  • 乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
  • 英文电商网站建设泛微oa办公系统教程
  • Windows环境搭建:PostGreSQL+PostGIS安装教程
  • SQL COUNT() 函数详解
  • 中山网站设计收费标准wordpress 右边栏
  • 坦桑尼亚网站域名后缀一个虚拟主机可以放几个网站
  • 从大模型到轻量级部署:知识蒸馏优化技术
  • 速通ACM省铜第二十一天(补) 赋源码(共现的数)
  • 自用,正点Linux虚拟机系统文件概况
  • 从“用框架”到“控系统”——业务模型和技术模型之间的映射
  • 洛谷 / 一本通 - dp 题目详解 7(超详细版)
  • 正点原子RK3568学习日记-GIT
  • 在Minio以STS方式获得临时凭据
  • 【多线程】屏障(Barrier)
  • 通过高新区网站建设兰州市城乡建设局网官网站