2010-07-08 27 views
6

Estoy tratando de controlar la visibilidad de una columna usando una casilla de verificación (esto está en WPF 4.0).WPF DataGrid - Ocultar columna usando un CheckBox

Aquí hay un fragmento de mi XAML:

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter" /> 
</Window.Resources> 

<CheckBox x:Name="GeneralDetailsVisible" Content="General Details" Margin="5"/> 

<DataGridTextColumn Header="Crew" 
    Binding="{Binding Path=Crew}" 
    Visibility="{Binding ElementName=GeneralDetailsVisible, 
         Converter={StaticResource BoolToVisConverter}, 
         Path=IsChecked}"> 
</DataGridTextColumn> 

Ahora sé que el convertidor está funcionando como BooleanToVisibilityConverter I unido a un bloque de texto y puedo ver los valores que estoy esperando. Si ingreso los valores a mano en la propiedad de visibilidad de columnas, funciona. Pero no cuando lo ato. ¿Qué estoy haciendo mal?

Respuesta:

Quartermeister me señaló a la respuesta. La página que señaló es un poco engañosa ya que el código que figura en la publicación no funciona y debe ver el código de muestra.

Aquí es mi último código, trabajando, por cualquier otra persona que se encuentra con este problema:

Converter para convertir la propiedad nuestras ViewModels bool en el valor correcto para nuestra Visibilidad atributo de columna.

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter" /> 
</Window.Resources> 

Enlaza la casilla de verificación a la propiedad ViewModels que controlará la visibilidad de las columnas.

<CheckBox 
    x:Name="DetailsVisible" 
    Content="Show Details" 
    IsChecked="{Binding Path=DisplayDetails}" /> 

A continuación, se unen a la propiedad Visibilidad ViewModels DisplayDetails. Tenga en cuenta que es a las columnas propias de DataContext a las que está vinculado.

<DataGridTextColumn 
    Header="Reliability" 
    Binding="{Binding Path=Reliability}" 
    Visibility="{Binding (FrameworkElement.DataContext).DisplayDetails, 
         RelativeSource={x:Static RelativeSource.Self}, 
         Converter={StaticResource BoolToVisConverter}}"> 
</DataGridTextColumn> 

Agregue el siguiente código a su proyecto, esto permite la captura del cambio en DataGrids DataContext.

FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn)); 

FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid), 
     new FrameworkPropertyMetadata 
      (null, FrameworkPropertyMetadataOptions.Inherits, 
      new PropertyChangedCallback(OnDataContextChanged))); 

Entonces cada vez que sus DataGrids DataContext se cambia actualizamos toda la DataGridColumsn adjunta con el nuevo DataContext.

public static void OnDataContextChanged(DependencyObject d, 
             DependencyPropertyChangedEventArgs e) 
{ 
    DataGrid grid = d as DataGrid; 
    if (grid != null) 
    { 
     foreach (DataGridColumn col in grid.Columns) 
     { 
      col.SetValue(FrameworkElement.DataContextProperty, e.NewValue); 
     } 
    } 
} 

One Tengo que tener en cuenta. Si agrega a sus DataContext a su página de este modo:

<Window.DataContext> 
    <vm:WeaponListViewModel /> 
</Window.DataContext> 

A continuación, se llamará a la función anterior antes de su cuadrícula de datos tiene ninguna columna!

Me salvé esto al adjuntar manualmente mi DataConext en código después de que se creó la ventana.

+0

imo, es más fácil de usar – testpattern

Respuesta

2

El problema es que las columnas DataGrid no son parte del árbol visual, por lo que no pueden usar enlaces. (La propiedad "Binding" es en realidad una propiedad normal del tipo Binding, no una propiedad de dependencia. Aplica ese objeto vinculante a las celdas, que son parte del árbol visual.)

Aquí hay un enlace a un blog que tiene una solución y demuestra la unión de la visibilidad de una columna a una casilla de verificación: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

1

OMI utilizando x:Name, x:Reference y Source es más simple:

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
</Window.Resources> 

<CheckBox x:Name="showImperial" Content="Show Details" /> 

<DataGrid> 
<DataGrid.Columns> 
<DataGridTextColumn Header="TOV (Bls)" 
        Width="80" 
        Binding="{Binding TOVBarrels}" 
        Visibility="{Binding Source={x:Reference showImperial}, 
           Path=IsChecked, 
           Converter={StaticResource BooleanToVisibilityConverter}}"/> 
</DataGrid.Columns> 
</DataGrid> 

Ver esta respuesta: Bind visibility to checkable menu item shows error "Service provider is missing the INameResolver service" in WPF

+0

Probamos esta cosa exacta y que sólo me da el error: 'Un referencia resuelta showImperial '. – jrandomuser

Cuestiones relacionadas