Ich möchte die% col_de% -Spaltensichtbarkeit durch einen DataGrid
, der dem Benutzer zur Verfügung steht, kontrollieren, indem ich mit der rechten Maustaste auf die Spaltenüberschrift klicke. Die ContextMenu
zeigt die Namen aller verfügbaren Spalten an. Ich benutze MVVM Design Pattern.
Meine Frage ist: Wie verbinde ich die ContextMenu
-Eigenschaft von DataGridColumn
mit der Visibility
-Eigenschaft von IsChecked
, die sich in MenuItem
befindet.
Einige Modellcode:
%Vor%... flaf flaf flaf
%Vor%Wenn ich unklar bin, lassen Sie es mich bitte wissen und ich werde versuchen, es auszuarbeiten.
Prost,
Ich habe gerade einen Blogbeitrag zu diesem Thema geschrieben. Es ermöglicht das Anzeigen oder Verbergen von DataGridColumns über ein ContextMenu, auf das durch Klicken mit der rechten Maustaste auf eine Spaltenüberschrift zugegriffen werden kann. Diese Aufgabe wird ausschließlich über angefügte Eigenschaften ausgeführt, sodass sie MVVM-kompatibel ist.
Ich habe nach einem generischen , XAML (dh keinem Code-behind), automatischen und einfachen Beispiel einer Spalte gesucht Auswahlmenü, das an eine WPF DataGrid-Spaltenüberschrift bindet. Ich habe buchstäblich Hunderte von Artikeln gelesen, aber keiner von ihnen scheint genau das Richtige zu tun, oder sie sind nicht generisch genug. Also hier ist, was ich denke, ist die beste kombinierte Lösung:
Fügen Sie diese zuerst in das Ressourcenverzeichnis ein. Ich überlasse es dem Leser als Übung, den Visibility / Boolean Converter zu schreiben, um sicherzustellen, dass die Checkboxen prüfen, ob die Spalte sichtbar ist und umgekehrt. Beachten Sie, dass durch die Definition von x: Shared="False" für die Kontextmenü-Ressource ein instanzspezifischer Zustand erhalten wird. Dies bedeutet, dass Sie diese einzelne Vorlage / Ressource für alle Ihre Datagrids verwenden können und alle ihren eigenen Status beibehalten.
%Vor%Definieren Sie dann das DataGrid wie folgt (wobei OrdersQuery eine Datenquelle ist, die vom View-Modell verfügbar gemacht wird):
%Vor%Damit erhalten Sie Folgendes:
Ich hoffe, das hilft Leuten, die nach einem solchen Beispiel gesucht haben.
Ich weiß, das ist ein bisschen alt. Aber ich habe versucht, dies zu tun und dieser Beitrag ist viel einfacher: Ссылка
Alles was Sie tun müssen, ist DataContext auf die Spalten zu setzen und dann die Sichtbarkeit wie gewohnt an Ihr ViewModel zu binden! :) Einfach und effektiv
Ok, das war ziemlich die Übung für ein WPF n00b.
IanR danke für den Vorschlag, dass ich einen ähnlichen Ansatz verwendet habe, aber es dosent bringt Sie den ganzen Weg.
Hier ist, was ich gefunden habe, wenn jemand eine konsistentere Art finden kann, es zu tun, werde ich alle Kommentare schätzen:
Hindernisse:
DataGridColumnHeader unterstützt kein Kontextmenü. Daher muss das Kontextmenü als Stil angewendet werden.
Das Kontextmenu hat seinen eigenen Datenkontext, daher müssen wir findancestor verwenden, um es mit dem ViewModels datacontext zu verknüpfen.
ATM Das DataGrid-Steuerelement parst seinen Datenkontext nicht in seine Spalten. Dies könnte im Codebehind gelöst werden, aber wir verwenden das MVVM-Muster, also habe ich beschlossen, jamiers Ansatz
Lösung:
Platzieren Sie die folgenden zwei Code-Blöcke in Window.Resources
%Vor%Das Datagrid sieht dann in XAML etwa so aus
%Vor%Die Sichtbarkeitseigenschaft in der DataGridColumn-Eigenschaft und die Ischek-Eigenschaft sind beide mit der IsHidden-Eigenschaft im viewModel verknüpft.
Im ViewModel:
%Vor%Die von Jaimer definierte Helper-Klasse:
%Vor%In das Viewmodel eingefügt (nur um es in einem realen Projekt über Unity anzuzeigen)
%Vor%Prost,
Anstelle von booleanToVisibilityConverter können Sie x: static
verwenden %Vor%Statik in XAML: Ссылка