WPF DataGrid隐藏某列 DataGridTextColumn动态绑定转换器

需求:根据另一控件改变DataGrid某列的可见性(Collapsed/Hidden/Visible)


原本 绑定字段是这样写的:

Visibility="{Binding ElementName=sample,Path=IsChecked,Converter={StaticResource BoolConverter}}"

但无论加载还是运行,都无法走到转换器,一般绑定Path没有问题。

网上的解释是,DataGrid列是抽象对象,Column在视觉树上找不到,因此绑定中使用到的 [ ElementName ]、[ RelativeSource ]属性都无法直接使用,而改用 "x:Reference"就可以解决。


方法来源: 

https://stackoverflow.com/questions/8847661/datagridtextcolumn-visibility-binding

同时,也把另一篇整理的不错的做个学习参考:

https://blog.csdn.net/wujingang/article/details/75314337


例:     CheckBox选中,列可见,否则隐藏(不预留列空间)




                
                    
                
            


用到转换器,将 true/false 属性值转换为 System.Windows.Visibility 属性类型。

界面的Resource资源中,引用转换器就可以了。

xmlns:vc="clr-namespace:ui.DataConverter"

...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace ui.DataConverter
{
    public class BoolConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                switch ((bool)value)
                {
                    case false:
                        return System.Windows.Visibility.Collapsed;
                    case true:
                        return System.Windows.Visibility.Visible;
                    default:
                        return System.Windows.Visibility.Collapsed;
                }
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}


补充精华:

总想多说两句... 

DataGridTextColumn 列宽自动调整 : Width="auto"

                                内容居左 / 居右对齐,设置属性 ElementStyle,对应的内容就是[ TextBlock ]控件类型的样式,在属性setter里写左右对齐方式就行,不过垂直居中好像不行。


你可能感兴趣的:(WPF)