为什么Browsable(false)不隐藏DataGrid中的列
本文关键字:DataGrid 隐藏 Browsable false 为什么 | 更新日期: 2023-09-27 18:02:44
在我的WPF应用程序中,我想通过在一些属性中添加[Browsable(false)]来隐藏绑定ItemsSource的DataGrid列但是,无论是否启用Browsable(false),所有列都是可见的。
我的模型:
public class Room : INotifyPropertyChanged
{
private int id;
...
[Browsable(false)]
public int Id
{
get
{
return this.id;
}
set
{
this.id = value;
this.OnPropertyChanged("Id");
}
}
...
public Room()
{
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler propertyChangedEventHandler = this.PropertyChanged;
if (propertyChangedEventHandler != null)
{
propertyChangedEventHandler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
视图:
<DataGrid Grid.Row="1" ItemsSource="{Binding Rooms}" SelectedItem="{Binding SelectedRoom, Mode=TwoWay}" />
如何使用Browsable(false)来隐藏列?
可以通过在DataGrid上连接AutoGeneratingColumn事件来隐藏它们(参见https://stackoverflow.com/a/3794324/4735446)。
public class DataGridHideBrowsableFalseBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
{
AssociatedObject.AutoGeneratingColumn += AssociatedObject_AutoGeneratingColumn;
base.OnAttached();
}
private void AssociatedObject_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (((PropertyDescriptor)e.PropertyDescriptor).IsBrowsable == false)
e.Cancel = true;
}
}
<DataGrid
ItemsSource="{Binding Path=DataGridSource, Mode=OneWay}"
AutoGenerateColumns="true">
<i:Interaction.Behaviors>
<behaviors:DataGridHideBrowsableFalseBehavior>
</behaviors:DataGridHideBrowsableFalseBehavior>
</i:Interaction.Behaviors>
</DataGrid>
恐怕不行。Browsable
属性只影响可视化设计器的Properties视图,它在运行时没有影响…
有关更多信息,请查看MSDN关于BrowsableAttribute的页面
不要在代码中调用this.OnPropertyChanged("Id");