Vincular visibilidad de columna de cuadrícula de datos MVVM

.Net 3.5

Sé que las columnas no heredan el contexto de datos y al leer otras publicaciones pensé que esto funcionaría:

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

Sin embargo, por supuesto que no … La ventana de salida no se queja, parece que el recurso que encontré pero la propiedad de modelo de vista se llama más reciente.

Esta es toda la DG:

                      

He leído casi todas las soluciones a este problema y nada funciona ..

DataGridColumn s no son parte del árbol visual, por lo que no están conectados al contexto de datos de DataGrid .

Para que se conecten, usa un enfoque de elementos proxy como este …

  1. Agregue un proxy FrameworkElement en los Resources su antecesor.
  2. Alojarlo en un ContentControl invisible vinculado a su Content .
  3. Utilice este ProxyElement como StaticResource para el origen de contexto de datos en su enlace de visibilidad.

                 

Además de DataGridColumn , el enfoque anterior también funciona muy bien para conectar DataContext a Popup sy ContextMenu (es decir, cualquier elemento que no esté conectado al árbol visual).

Usuarios de Silverlight

Lamentablemente, establecer el contenido de los controles de contenido con cualquier elemento del marco no está permitido en Silverlight. Entonces la solución sería (esto es solo un código de guía para Silverlight) …

  1. Cambie el recurso de elemento de marco a algo ligero como un Textblock . (Silverlight no permite especificar recursos estáticos de tipo FrameworkElement ).

       
  2. Escriba una propiedad adjunta para mantener el bloque de texto en contra del control de contenido.

      
  3. En el controlador de eventos cambiado propiedad propiedad de dependencia, establezca el contexto de datos de enlace del control de contenido en el bloque de texto.

      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); } } 

De esta forma, el bloque de texto puede no estar conectado al árbol visual, pero probablemente estará al tanto de los cambios en el contexto de datos.

Espero que esto ayude.