Binden Sie DataGrid-Spalte Sichtbarkeit MVVM

.Net 3.5

Ich weiß, dass die Spalten den Datacontext nicht erben und durch das Lesen anderer Posts dachte ich, das würde funktionieren:

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" 

Allerdings ist es natürlich nicht .. Das Ausgabefenster klagen nicht, es scheint, dass die Ressource ich gefunden habe, aber die viewmodel Eigenschaft ist neuer genannt.

Das ist die gesamte DG:

                      

Ich habe so ziemlich jede einzelne Lösung dieses Problems gelesen und nichts funktioniert.

DataGridColumn sind nicht Teil der visuellen DataGridColumn sodass sie nicht mit dem Datenkontext des DataGrid .

Um sie miteinander zu verbinden, verwenden Sie den Proxy-Element-Ansatz wie folgt …

  1. Fügen Sie in den Resources Ihres Vorgängerbereichs ein Proxy- FrameworkElement .
  2. ContentControl es in einem unsichtbaren ContentControl , das an seinen Content gebunden ist.
  3. Verwenden Sie dieses ProxyElement als StaticResource für die Datenkontextquelle in Ihrer Sichtbarkeitsbindung.

                 

Abgesehen von DataGridColumn der obige Ansatz auch hervorragend, um DataContext mit Popup s und ContextMenu zu verbinden (dh jedes Element, das nicht mit dem visuellen Baum verbunden ist).

Silverlight Benutzer

Leider ist es in silverlight nicht erlaubt Inhalte von Content Controls mit irgendwelchen Framework Elementen zu setzen. Also der Workaround wäre (dies ist nur ein Leitfaden für Silverlight) …

  1. Ändern Sie die Framework-Element-Ressource in etwas Leichtgewichtiges wie einen Textblock . (Silverlight erlaubt keine Angabe der statischen Ressource des FrameworkElement Typs.)

       
  2. Schreiben Sie eine angefügte Eigenschaft, um den Textblock gegen das Inhaltssteuerelement zu halten.

      
  3. Setzen Sie im angefügten Abhängigkeitshandler für die Abhängigkeitseigenschaft den Datenkontext des Inhaltssteuerelements auf den Textblock.

      private static void OnProxyElementPropertyChanged( DependencyObject depObj, DependencyPropertyChangedEventArgs e) { if (depObj is ContentControl && e.NewValue is TextBlock) { var binding = new Binding("DataContext"); binding.Source = depObj; binding.Mode = OneWay; BindingOperations.SetBinding( (TextBlock)e.NewValue, TextBlock.DataContextProperty, binding); } } 

Auf diese Weise ist der Textblock möglicherweise nicht mit dem visuellen Baum verbunden, aber er wird sich wahrscheinlich der Datenkontextänderungen bewusst sein.

Hoffe das hilft.