需求:根据另一控件改变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里写左右对齐方式就行,不过垂直居中好像不行。