c# - personalizar - wpf datagrid columns
WPF Datagrid RowDetailsTemplate visibilidad vinculada a una propiedad (2)
Usando XAML puro (+ un convertidor):
XAML:
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<ToggleButton
IsChecked="{Binding Path=DetailsVisibility,
RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},
Converter={StaticResource _VisibilityToNullableBooleanConverter}}"
/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
Convertidor:
public class VisibilityToNullableBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return (((Visibility)value) == Visibility.Visible);
}
else
{
return Binding.DoNothing;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool?)
{
return (((bool?)value) == true ? Visibility.Visible : Visibility.Collapsed);
}
else if (value is bool)
{
return (((bool)value) == true ? Visibility.Visible : Visibility.Collapsed);
}
else
{
return Binding.DoNothing;
}
}
}
Estoy usando un WPF Datagrid con un panel RowDetails donde RowDetailsVisibilityMode se establece en "VisibleWhenSelected" y SelectionMode = "Extended" para que se puedan seleccionar múltiples filas y mostrar RowDetails, como se muestra a continuación:
<dg:DataGrid x:Name="MyGrid"
ItemsSource="{Binding Path=MyItems}"
AutoGenerateColumns="True"
SelectionMode="Extended"
RowDetailsVisibilityMode="VisibleWhenSelected">
<dg:DataGrid.RowDetailsTemplate>
<DataTemplate>
<TextBlock Text="Further Details..."/>
</DataTemplate>
</dg:DataGrid.RowDetailsTemplate>
...
</dg:DataGrid>
Desafortunadamente, para esta aplicación no es intuitivo mostrar detalles de filas en filas ''seleccionadas'', el cliente desea hacer clic en una casilla de verificación en varias filas para mostrar el panel RowDetails, pero también desplazarse por la cuadrícula seleccionando otras filas. En otras palabras, arregle las filas que muestran RowDetails sin importar lo que ocurra en DataGrid.
Por lo tanto, al desplazarse, se cierran los RowDetailsPanes que han abierto. Lo que me gustaría hacer es tener una casilla de verificación en una de las columnas y vincular la visibilidad del panel RowDetails a esta propiedad, pero no puedo encontrar la manera de hacerlo. El problema es simplemente que RowDetailsPane solo funciona en la (s) selección (es) de fila en la cuadrícula de datos. ¿Se puede extender de alguna manera para operar en una propiedad de mi elección?
Gracias de antemano, Will
Mirando el código fuente del juego de herramientas WPF, cada DataGridRow tiene una propiedad de Visibilidad de Detalles.
Puse un botón (solo para probar) en la primera columna.
<toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="buttonDetails" Content="Hello" ButtonBase.Click="Details_Click" />
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
Cuando se hace clic en el botón, busque la fila cliqueada y alterne la propiedad.
private void Details_Click(object sender, RoutedEventArgs e)
{
try
{
// the original source is what was clicked. For example
// a button.
DependencyObject dep = (DependencyObject)e.OriginalSource;
// iteratively traverse the visual tree upwards looking for
// the clicked row.
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
// if we found the clicked row
if (dep != null && dep is DataGridRow)
{
// get the row
DataGridRow row = (DataGridRow)dep;
// change the details visibility
if (row.DetailsVisibility == Visibility.Collapsed)
{
row.DetailsVisibility = Visibility.Visible;
}
else
{
row.DetailsVisibility = Visibility.Collapsed;
}
}
}
catch (System.Exception)
{
}
}
No he explorado hacer esto a través de enlace de datos.