2017-02-12 6 views
0

Ich möchte, dass die Benutzer meines Programms selbst entscheiden können, welche Spalten sie in meinem ListView/GridView sehen möchten.WPF: Wie finde ich ColumnHeader zu meiner Spalte?

Für die erstellt I zwei angefügten Eigenschaften für GridViewColumn, einer IsColumnVisible von Boolean Typ genannt (toggeln Sichtbarkeit der Säule ein und aus), und das andere ist LastWidth vom Typ genannt Double (Halte die Breite dieser Spalte, wenn es war zuletzt sichtbar).

Die Eigenschaft IsColumnVisible hat eine OnChangedCallback.
Wenn die Eigenschaft auf False gesetzt ist, ist die aktuelle Breite der Spalte in meiner Eigenschaft LastWidth und legen Sie speichern die aktuelle Breite auf 0
Wenn die Eigenschaft auf True gesetzt ist, ich die letzte Breite der Spalte von meinem bekommen Eigenschaft LastWidth und setzen Sie die aktuelle Breite auf diesen Wert.

Dies funktioniert so weit, aber mit dem Fehler, dass man die versteckten Spalten mit der Maus skalieren kann, um wieder sichtbar zu sein. Wenn Sie also drei Spalten haben und die mittlere ausblenden, wird die Größe der zweiten Spalte durch die Größenänderung der ersten Spalte wieder sichtbar.

Um loszuwerden, wollte ich den IsEnabled Zustand der Header der versteckten Spalten zu False setzen und das ist, wo das Problem beginnt.

Lassen Sie uns sagen, dass meine Spalten in XAML definiert werden wie folgt (Spalten 1 und 4 sichtbar, Spalten 2 und 3 versteckt):

<GridView AllowsColumnReorder="True"> 
    <GridViewColumn Header="Column 1" Width="50" DisplayMemberBinding="{Binding Column1}" local:GridViewColumnConfig.IsColumnVisible="True" /> 
    <GridViewColumn Header="Column 2" Width="50" DisplayMemberBinding="{Binding Column2}" local:GridViewColumnConfig.IsColumnVisible="False" /> 
    <GridViewColumn Header="Column 3" Width="50" DisplayMemberBinding="{Binding Column3}" local:GridViewColumnConfig.IsColumnVisible="False"> 
     <GridViewColumn.Header> 
      <GridViewColumnHeader Content="Column 4" /> 
     </GridViewColumn.Header> 
    </GridViewColumn> 
    <GridViewColumn Header="Column 4" Width="50" DisplayMemberBinding="{Binding Column4}" local:GridViewColumnConfig.IsColumnVisible="True" /> 
</GridView> 

Da der Standardwert meiner Eigenschaft IsColumnVisibleTrue ist, meine OnChangedCallback dieser Eigenschaft läuft nur für Spalten 2 und 3

ich ein Objekt vom Typ habe GridViewColumn im OnChangedCallback und in der Lage zu sein, den IsEnabled Zustand der Spaltenüberschrift gesetzt ich brauche die GridViewColumnHeader meine GridViewColumn zu bestimmen .
Ein GridViewColumn hat eine Eigenschaft Header vom Typ Object. Im Fall von Spalte 2 enthält diese Eigenschaft die Spalte String "Spalte 2", im Fall von Spalte 3 ist diese Eigenschaft Nothing.

Gibt es eine Möglichkeit, den Header meiner GridViewColumn als GridViewColumnHeader Objekt zu bekommen?

Bei Spalte 2 konnte ich ein GridViewColumnHeader Objekt selbst erstellen, setzen Sie es Content auf den Wert der Header Eigenschaft ist und dann die Header Eigenschaft auf dieses Objekt.
Aber ich würde diese Änderungen lieber nicht tun, wenn ich nicht muss.

Im Falle der Spalte 3 sollte es schon irgendwo ein GridViewColumnHeader Objekt geben (da ich es in XAML definiert habe), aber ich kann es nicht finden.
Ich habe bereits versucht, den Visual Tree zu gehen, aber seit GridViewColumn ist kein Visual oder Visual3D, das ist nicht möglich.

Irgendwelche Ideen? Vielen Dank.

Antwort

1

Gibt es eine Möglichkeit, den Header meiner GridViewColumn als GridViewColumnHeader Objekt zu bekommen?

Der einfachste Weg, dies zu tun zu setzen wäre, den Wert der benutzerdefinierten angefügten Eigenschaft nach Sie den Wert der Header Eigenschaft festgelegt haben.

Sie können dies tun, wenn Sie mit Elementsyntax wechseln:

<GridViewColumn Width="50" DisplayMemberBinding="{Binding Column3}" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <GridViewColumn.Header> 
     <GridViewColumnHeader Content="Column 4" /> 
    </GridViewColumn.Header> 
    <local:GridViewColumnConfig.IsColumnVisible> 
     <sys:Boolean>False</sys:Boolean> 
    </local:GridViewColumnConfig.IsColumnVisible> 
</GridViewColumn> 

Dann können Sie einfach werfen die Header Eigenschaft auf einen GridViewColumnHeader in Ihrem PropertyChangedCallback:

Private Shared Sub OnPropertyChanged(d As GridViewColumn, e As DependencyPropertyChangedEventArgs) 
    Dim header = TryCast(d.Header, GridViewColumnHeader) 
    '... 
End Sub 
+0

So gibt es Ist eigentlich kein impliziter GridViewColumnHeader, wenn ich die Attributsyntax für den Header verwende (wie in Spalte 2)? – Nostromo

+0

Das Problem besteht darin, dass die Header-Eigenschaft * vor * der IsColumnVisible-Eigenschaft gesetzt wird, wenn Sie die Attributsyntax verwenden. Deshalb gibt die Header-Eigenschaft in Ihrem Callback Nothing zurück. – mm8

+0

Da ich immer daran denken muss, die Element-Syntax zu verwenden, wenn ich dieses angehängte Verhalten verwenden möchte, und da ich lieber in Erinnerung bleiben möchte, als mich selbst zu erinnern ... haben Sie irgendwelche Vorschläge, wie oder wo Sie zu erhöhen haben eine Ausnahme, wenn meine Eigenschaft vor der Kopfzeile festgelegt ist? – Nostromo

Verwandte Themen