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 IsColumnVisible
True
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.
So gibt es Ist eigentlich kein impliziter GridViewColumnHeader, wenn ich die Attributsyntax für den Header verwende (wie in Spalte 2)? – Nostromo
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
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