为什么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)来隐藏列?

为什么Browsable(false)不隐藏DataGrid中的列

可以通过在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");