【问题标题】:Hiding columns from datagrid when autogenerate=false当 autogenerate=false 时隐藏数据网格中的列
【发布时间】:2016-11-07 21:42:00
【问题描述】:

我在代码隐藏中创建列。每列都绑定到一个属性。

Dim column_selected As New DataGridCheckBoxColumn()
column_selected.Header = "Selected"
column_selected.Binding = New Binding("IsChecked")
dgvResults.Columns.Add(column_selected)

我希望能够隐藏一列,基于复选框或类似性质的东西,我可以随意隐藏/显示它们。

我听说过将可见性绑定到属性布尔值,但我不确定在后面的代码中创建列时如何做到这一点。

关于如何实现这一点的任何想法?假设我想要一个隐藏特定列的复选框,如果您取消选中它,它会显示它。

【问题讨论】:

    标签: wpf vb.net datagrid


    【解决方案1】:

    如果设置列可见性的逻辑不包含任何业务逻辑,这是明确的 UI 操作。那我觉得你可以把它放在代码隐藏中,有什么问题?

    XAML

    <CheckBox Checked="HideColumn" Unchecked="UnhideColumn"/>
    

    代码隐藏

    Protected Sub HideColumn()
        'your code
    End Sub
    
    Protected Sub UnhideColumn()
        'your code
    End Sub
    

    【讨论】:

    • 我如何引用绑定名称而不是索引?他们可以移动列,这样可能会很糟糕。
    • 你可以在运行时找到列的索引datagrid.Columns.ToList().FindIndex(Function(column) column.Header.Equals("YourHeader"))
    【解决方案2】:

    您可以从代码隐藏中正常设置绑定,但由于 System.Visibilty 是枚举,您必须使用转换器(IValueConverter 接口的实例)来正确设置绑定。有很多可能的实现,下面是一个例子:

    public class BoolToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool? vis = value as bool?;
            return (vis.HasValue && vis.Value) ? Visibility.Visible : Visibility.Collapsed;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    之后,您唯一应该做的就是将您的 Binding 的 Converter 属性设置为 BoolToVisibilityConverter 的新实例,如下所示:

    column_selected.Binding.Converter = new BoolToVisibilityConverter()
    

    仅此而已。

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      相关资源
      最近更新 更多