【问题标题】:WPF Datagrid - Set Column visibility per rowWPF Datagrid - 设置每行列的可见性
【发布时间】:2011-04-28 05:21:24
【问题描述】:

有没有办法根据绑定隐藏给定的列。我尝试在 DataGridTextColumn 上设置可见性属性(使用正确的转换器),但这似乎不起作用。如果我直接设置值(而不是通过绑定)它可以工作。那么,对于数据网格来说,列可见性是全有还是全无?

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

    看看这个帖子,问题说明了
    Binding in a WPF data grid text column
    在这里
    http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

    从第一个链接引用 JaredPar
    “本质上的问题是 DataGridTextColumn 没有可以从其继承绑定的父级,因为它不是逻辑或可视树的一部分。您必须设置继承上下文才能访问绑定信息”

    解决方法以使其正常工作..

    public class DataGridContextHelper
    {
        static DataGridContextHelper()
        {
            DependencyProperty dp = FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));
            FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid),
            new FrameworkPropertyMetadata
               (null, FrameworkPropertyMetadataOptions.Inherits,
               new PropertyChangedCallback(OnDataContextChanged)));
        }
    
        public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DataGrid grid = d as DataGrid;
            if (grid != null)
            {
                foreach (DataGridColumn col in grid.Columns)
                {
                    col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);
                }
            }
        }
    }
    
    public partial class App : Application
    {
        static DataGridContextHelper dc = new DataGridContextHelper(); 
    }
    
    <DataGrid x:Name="c_dataGrid" AutoGenerateColumns="False" DataContext="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=SelectedItem}">
        <DataGrid.Columns>
            <DataGridTextColumn Visibility="{Binding Path=(FrameworkElement.DataContext), RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource HideColumnAConverter}}" />
        </DataGrid.Columns>
    </DataGrid>
    
    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return Visibility.Visible;
        }
        // Whatever you're binding against
        TestClass testClass = value as TestClass;
        return testClass.ColumnAVisibility;
    }
    

    【讨论】:

    • 这适用于整个列...我正在寻找的是单独的行控制。例如,第 1 行有 5 列,第 2 行有 4 列,因为其中一列是隐藏的。
    • 更新了我的例子,希望这能做到 :) 为 DataGrid 添加 DataContext="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=SelectedItem}" 并为每列添加一个转换器.
    • 或者,如果您要绑定可见性属性,则可能是不使用转换器的更好方法。
    • 我会感谢你,因为你让我思考,但最终似乎有一个更简单的解决方案。
    • 那么请与我们分享这个更简单的解决方案,AKoran ;)
    【解决方案2】:

    你真正需要做的就是添加:

        <Style x:Key="vStyle" TargetType="{x:Type DataGridCell}">
            <Setter Property="Visibility" Value="{Binding YourObjectVisibilityProperty}"/>
        </Style>
    

    然后在您的列中使用以下内容:

    <DataGridTextColumn CellStyle="{StaticResource vStyle}"/>
    

    【讨论】:

      猜你喜欢
      • 2016-02-21
      • 2018-07-28
      • 1970-01-01
      • 2012-01-30
      • 2014-10-30
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多