当 ItemSource 是一个 Observable 集合时,隐藏 DataGrid 中的列

Hide a Column from a DataGrid when the ItemSource is an Observable Collection

我有一个 DataGrid,其中 ItemSource 是一个使用 MVVM 原型绑定的 Observable 集合。我不想在我的 DataGrid 中显示 class 的 ID 属性,但是我仍然需要 属性 存在。

我的代码:

XAML

<DataGrid ItemsSource="{Binding MyData}" IsReadOnly="True" Name="dtSearch" />

查看模型

    private ObservableCollection<MyDataClass> myData;
    public ObservableCollection<MyDataClass> MyData
    {
        get { return myData; }
        set
        {
            myData= value;
            RaisePropertyChanged("MyData");
        }
    }

可观察到Class

public partial class MyDataClass
{
    public int ID { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}

有没有我可以提供我的 ID 属性 的属性,以便在 DataGrid 中隐藏它?

我是否需要为可见属性创建另一个 class?

无论数据是否驻留在 ObservableCollection 中,都会发生此问题。

要更正此问题,必须将网格设置为而非 自动生成列。这是通过设置 属性 AutoGenerateColumns=False 然后在 xaml 中指定所需的列来完成的。

<DataGrid ItemsSource="{Binding  MyData}" AutoGenerateColumns="False" >
   <DataGrid.Columns>
      <DataGridTextColumn Header="The Code"
                          Binding="{Binding Code}"/>
      <DataGridTextColumn Header="The Name"
                          Binding="{Binding Name}"/>
      <DataGridTextColumn Header="The Type"
                          Binding="{Binding Type}"/>
   </DataGrid.Columns>
  </DataGrid>

DataGrid 的文档中查看更多列选项。

XAML:

  <DataGrid x:Name="dataGrid1" Margin="0" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
                <DataGridTextColumn Binding="{Binding Code}" Header="Code"/>
                <DataGridTextColumn Binding="{Binding Type}" Header="Type"/>
            </DataGrid.Columns>
   </DataGrid>

后面的代码:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ObservableCollection<MyDataClass> data = new ObservableCollection<MyDataClass>();
        data.Add(new MyDataClass { Code = "Code 1", ID = 1, Name = "Name 1", Type = "Type 1" });
        data.Add(new MyDataClass { Code = "Code 2", ID = 2, Name = "Name 2", Type = "Type 2" });
        data.Add(new MyDataClass { Code = "Code 3", ID = 3, Name = "Name 3", Type = "Type 3" });
        data.Add(new MyDataClass { Code = "Code 4", ID = 4, Name = "Name 4", Type = "Type 4" });
        data.Add(new MyDataClass { Code = "Code 5", ID = 5, Name = "Name 5", Type = "Type 5" });

        dataGrid1.ItemsSource = data;
    }

结果:

WPF 数据绑定引擎绑定到对象的所有 public 属性。因此,最简单的方法是让您的 ID 属性 internal(如果这不会破坏任何其他代码)。
但是,绑定到对象列表时有一种更通用的方法。首先,将以下内容放在一些常见的地方:

public class BindableCollection<T> : ObservableCollection<T>, ITypedList
{
    string ITypedList.GetListName(PropertyDescriptor[] listAccessors) { return null; }
    PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)
    {
        return TypeDescriptor.GetProperties(typeof(T), PropertyFilter);
    }
    static readonly Attribute[] PropertyFilter = { BrowsableAttribute.Yes };
}

并使用 class 而不是 ObservableCollection<T>。然后只需使用 Browsable 属性来隐藏项目 class 的成员。对于您的示例,它是这样的:

查看模型

private BindableCollection<MyDataClass> myData;
public BindableCollection<MyDataClass> MyData
{
    get { return myData; }
    set
    {
        myData= value;
        RaisePropertyChanged("MyData");
    }
}

可观察到Class

public partial class MyDataClass
{
    [Browsable(false)]
    public int ID { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}

您可以在 DataGrid 对象的 AutoGeneratedColumns 事件中修改列。 您可以重命名它们并删除那些您不想显示的。