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.
imo, es más fácil de usar – testpattern