当ItemSource是Observable集合时,从DataGrid中隐藏列

Rya*_*rle 5 c# wpf xaml observablecollection mvvm

我有一个DataGridItemSource是利用可观察集合约束MVVM原型。我不想显示在我的类中显示的ID属性,DataGrid但是我仍然需要该属性存在。

我的代码:

XAML

<DataGrid ItemsSource="{Binding MyData}" IsReadOnly="True" Name="dtSearch" />
Run Code Online (Sandbox Code Playgroud)

查看模型

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

可观察类

public partial class MyDataClass
{
    public int ID { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

是否可以提供ID属性以将其隐藏DataGrid

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

Ωme*_*Man 6

无论数据是否驻留在此问题都将发生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>
Run Code Online (Sandbox Code Playgroud)

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


Iva*_*oev 6

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

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 };
}
Run Code Online (Sandbox Code Playgroud)

并使用该类代替ObservableCollection<T>。然后,只需使用Browsable属性即可隐藏item类的成员。对于您的示例,它是这样的:

查看模型

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

可观察类

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; }
}
Run Code Online (Sandbox Code Playgroud)