WPF DataGrid: Sichtbarkeit der DataGridColumn für ContextMenu MenuItems IsChecked (MVVM)

7

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,

    
Fubzot 13.10.2009, 15:12
quelle

6 Antworten

18

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.

Siehe Blogpost

    
Tim Valentine 11.01.2011, 22:22
quelle
12

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:

  1. Ein Kontextmenü , das an die Spaltenüberschriften gebunden ist und als Spaltenauswahlfunktion dient.
  2. Ein Kontextmenü, das an die Elemente im Raster gebunden ist (um Aktionen an den Elementen selbst auszuführen - wiederum ist das Binden der Aktionen eine Übung für den Leser).

Ich hoffe, das hilft Leuten, die nach einem solchen Beispiel gesucht haben.

    
Webreaper 04.07.2012 12:20
quelle
6

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

    
Roman 25.07.2011 10:45
quelle
1

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:

  1. DataGridColumnHeader unterstützt kein Kontextmenü. Daher muss das Kontextmenü als Stil angewendet werden.

  2. Das Kontextmenu hat seinen eigenen Datenkontext, daher müssen wir findancestor verwenden, um es mit dem ViewModels datacontext zu verknüpfen.

  3. 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,

    
Fubzot 16.10.2009 09:31
quelle
0

Anstelle von booleanToVisibilityConverter können Sie x: static

verwenden %Vor%

Statik in XAML: Ссылка

    
Sergey Malyan 13.05.2010 22:17
quelle
-1

Ich habe versucht, das mit ContextMenu zu verbinden, indem ich 'ElementName' verwende, aber am Ende habe ich es mit Eigenschaften in der VM arbeiten lassen, z. B.

%Vor%

und im XAML:

%Vor%     
kiwipom 13.10.2009 20:30
quelle

Tags und Links