Laden...

[SL2] DataGrid mit AutoGenerateColumns=true: Bestimmte Columns ausblenden?

Erstellt von 7.e.Q vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.271 Views
7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 14 Jahren
[SL2] DataGrid mit AutoGenerateColumns=true: Bestimmte Columns ausblenden?

Hi Leute,

ich kann ja an ein DataGrid eine Collection binden und das DataGrid zeigt mir die einzelnen Objekte in der Collection an. Wenn ich AutoGenerateColumns auf True habe, werden die Columns anhand der Properties der Objektklasse generiert.

**Frage: **

Kann ich in der Klasse selbst - eventuell über Attributes (System.Attribute) - definieren, welche Properties als Spalten angezeigt werden sollen und welche nicht?

Ich weiß, dass das für Komponentenentwicklung im Visual Studio geht. Da kann man per Attributes definieren, ob und wie welche Property im PropertyGrid des Studios angezeigt werden soll.

Wenn es das DataGrid nicht schon von Haus aus kann, dann kann ich das auch coden. Ich würd nur gern wissen, ob sowas schon jetzt geht, ohne dass ich was am DataGrid erweitern muss.

//edit: ach ja, und, nein, ich möchte die Festlegung der Darstellung der einzelnen Properties nicht im XAML haben, weil ich unterschiedliche Objekt-Sammlungen an das Grid binden will. Die Objektklassen sollen selber festlegen, welche Properties der Benutzer zu sehen bekommt und welche nicht.

Danke sehr!

Grüße,
Hendrik

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 14 Jahren

Mal eben quick & dirty zusammen gehackt...

Code aus einer von DataGrid abgeleiteten Komponente:


        protected override void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e)
        {
            var itemsQuery = from object pItem in this.ItemsSource
                             select pItem;
            // TODO: Fehlerbehandlung für den Fall, dass ItemsSource leer ist...
            object tObj = itemsQuery.First<object>();
            Type tType = tObj.GetType();

            PropertyInfo tPropInfo = tType.GetProperty(e.PropertyName);
            if(tPropInfo != null)
            {
                bool bShowColumn = true;
                Attribute[] tAttributes = System.Attribute.GetCustomAttributes(tPropInfo);

                foreach(Attribute tCurrentAttribute in tAttributes)
                {
                    if(tCurrentAttribute is DataGridVisibilityAttribute)
                    {
                        bShowColumn = (tCurrentAttribute as DataGridVisibilityAttribute).Show;
                    }
                }

                if (!bShowColumn) e.Column.Visibility = Visibility.Collapsed;
            }

            base.OnAutoGeneratingColumn(e);
        }

Und das DataGridVisibilityAttribute:


    class DataGridVisibilityAttribute : Attribute
    {
        bool bShow = true;
        public bool Show
        {
            get { return bShow; }
            set { bShow = value; }
        }

        public DataGridVisibilityAttribute(bool Show)
        {
            this.Show = Show;
        }

        public DataGridVisibilityAttribute()
            : this(true)
        {

        }
    }

Funktioniert, aber... geht sowas nicht eventuell schon von Haus aus mit dem DataGrid?