当AutoGenerateColumns = True时,有没有办法隐藏DataGrid中的特定列?

Rac*_*hel 27 wpf xaml datagrid

我有一个使用AutoGenerateColumns = True绑定到DataTable的WPF 4.0 DataGrid.列是动态的,但我知道总会有一个名为ID的列,我想隐藏这一列.有没有办法可以做到这一点?

Ale*_* Lo 36

在您的数据网格中,订阅AutoGeneratingColumn事件,event args(DataGridAutoGeneratingColumnEventArgs)具有列名称和" Cancel",如果列名称是ID然后设置Cancel = true.应该做的伎俩.

  • 你可以构建一个视图模型,公开一个`DataTable`和一个列自动生成应该跳过的列,让'AutoGeneratingColumn`事件使用该列表,并在晚上把自己塞进床上,知道你已经知道了仍然将视图与视图模型分开. (7认同)
  • 谢谢,这将很好地工作.在这种情况下我不太关心MVVM,因为DataGrid是自定义UserControl的一部分,如果它只影响View,我使用代码隐藏没有问题. (4认同)
  • 代码示例http://msdn.microsoft.com/ru-ru/library/system.windows.controls.datagrid.autogeneratingcolumn(v=VS.100).aspx (2认同)

Eri*_*let 12

您可以使用行为(可重用代码)来完成工作......这样您就可以使用将列可见性集中在一个位置的属性.

用法:

<Window
...
 xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary">

<DataGrid ...
    extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True">
Run Code Online (Sandbox Code Playgroud)

...

public class YourObjectItem
{
    [Browsable(false)]
        public Assembly Assembly { get; set; }
Run Code Online (Sandbox Code Playgroud)

码:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace HQ.Wpf.Util.Behaviors
{
    /// <summary>
    /// Using this behavior on a dataGRid will ensure to display only columns with "Browsable Attributes"
    /// </summary>
    public static class DataGridBehavior
    {
        public static readonly DependencyProperty UseBrowsableAttributeOnColumnProperty =
            DependencyProperty.RegisterAttached("UseBrowsableAttributeOnColumn",
            typeof(bool),
            typeof(DataGridBehavior),
            new UIPropertyMetadata(false, UseBrowsableAttributeOnColumnChanged));

        public static bool GetUseBrowsableAttributeOnColumn(DependencyObject obj)
        {
            return (bool)obj.GetValue(UseBrowsableAttributeOnColumnProperty);
        }

        public static void SetUseBrowsableAttributeOnColumn(DependencyObject obj, bool val)
        {
            obj.SetValue(UseBrowsableAttributeOnColumnProperty, val);
        }

        private static void UseBrowsableAttributeOnColumnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            var dataGrid = obj as DataGrid;
            if (dataGrid != null)
            {
                if ((bool)e.NewValue)
                {
                    dataGrid.AutoGeneratingColumn += DataGridOnAutoGeneratingColumn;
                }
                else
                {
                    dataGrid.AutoGeneratingColumn -= DataGridOnAutoGeneratingColumn;
                }
            }
        }

        private static void DataGridOnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            var propDesc = e.PropertyDescriptor as PropertyDescriptor;

            if (propDesc != null)
            {
                foreach (Attribute att in propDesc.Attributes)
                {
                    var browsableAttribute = att as BrowsableAttribute;
                    if (browsableAttribute != null)
                    {
                        if (!browsableAttribute.Browsable)
                        {
                            e.Cancel = true;
                        }
                    }

                    // As proposed by "dba" stackoverflow user on webpage: 
                    // https://stackoverflow.com/questions/4000132/is-there-a-way-to-hide-a-specific-column-in-a-datagrid-when-autogeneratecolumns
                    // I added few next lines:
                    var displayName = att as DisplayNameAttribute;
                    if (displayName != null)
                    {
                        e.Column.Header = displayName.DisplayName;
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Boe*_*ern 5

其他可能性是Visibility.Collapsed

    private void dataGrid_AutoGeneratingColumn(object sender, 
        DataGridAutoGeneratingColumnEventArgs e)
    {
        //Set properties on the columns during auto-generation 
        switch (e.Column.Header.ToString())
        {
            case "rownameYouWantToHide":
                e.Column.Visibility = Visibility.Collapsed;
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)