c# - La vinculación a DataGridColumn con IMultiValueConverter encuentra problemas al usar un IValueConverter similar no
.net wpf (0)
Tengo 2 columnas de casilla de verificación Datagrid, cada una con un enlace.
<DataGrid ItemsSource="{Binding}" Name="DataGrid1" DataContext="{Binding Source={StaticResource TableViewSource}}">
<DataGridCheckBoxColumn Header="Required" Width="50" MinWidth="50">
<DataGridCheckBoxColumn.Binding>
<Binding Path="Required" Converter="{StaticResource DateTimeToBooleanConverter}"/>
</DataGridCheckBoxColumn.Binding>
</DataGridCheckBoxColumn>
<DataGridCheckBoxColumn Header="Required Test" Width="60" MinWidth="60">
<DataGridCheckBoxColumn.Binding>
<MultiBinding Converter="{StaticResource DateTimeToBooleanMultiverter}">
<Binding Path="Required_Date" />
<Binding Path="Required_Time" />
</MultiBinding>
</DataGridCheckBoxColumn.Binding>
</DataGridCheckBoxColumn>
</DataGrid>
Los enlaces simplemente escriben la fecha / hora en que el recuadro fue marcado en el campo db "Required"
y nulo cuando está desmarcado.
En la primera casilla, todo funciona bien con el siguiente convertidor:
public class DateTimeToBooleanConverter : IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null) {
return true;
} else {
return false;
}
}
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == true) {
return System.DateTime.Now.Date;
} else {
return null;
}
}
}
En la última columna, quería guardar la fecha y la hora en 2 campos diferentes "Required_Date"
y "Required_Time" (String)
. El siguiente IMultiConverter
fue creado para manejarlo:
public class DateTimeToBooleanMultiverter : IMultiValueConverter
{
public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values[0] != null) {
return true;
} else {
return false;
}
}
public object[] ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null) {
if (value == true) {
return {
System.DateTime.Now.Date,
System.DateTime.Now.TimeOfDay.ToString()
};
}
}
return {
null,
null
};
}
}
En la carga inicial, la columna se ve bien. La columna tiene todas las celdas apropiadas marcadas. Sin embargo, cuando el valor se marca / desmarca, obtengo el siguiente error de enlace.
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value=''True'' MultiBindingExpression:target element is ''DataGridCell'' (Name=''''); target property is ''CellContent'' (type ''String'')
Además, cuando desactivo una celda, no se desmarca correctamente y noto a través de algunos puntos de interrupción en mi convertidor que los valores están entrando como DependencyProperty.Unset
(Probablemente debido a la advertencia de enlace).
(9-30-12)
Encontré una ventaja más prometedora en un comentario codeplex:
"El motivo por el que MultiBindings no funciona es que DataGridHelper.UpdateSource usa GetBindingExpression y no GetBindingExpressionBase. Si se cambia, los enlaces multi y prioritarios deberían funcionar".
BindingBaseExpression
configurar la actualización en Explicit
y crear un evento DataGrid_EndCellEdit
que llama a BindingBaseExpression
para actualizar, pero creo que DataGridColumn está ignorando la opción de actualización.
(10-12-12)
Todavía no tuve suerte, intenté trabajar con BindingBaseExpression
en vano. Obviamente, el enlace IMultiValueCOnverter
está haciendo algo extraño.