当 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
事件中修改列。
您可以重命名它们并删除那些您不想显示的。
我有一个 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
事件中修改列。
您可以重命名它们并删除那些您不想显示的。