При связывании с DataGridColumn с IMultiValueConverter возникают проблемы, в то время как при использовании подобного IValueConverter нет
У меня есть 2 столбца флажка Datagrid каждый с привязкой.
<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>
Привязки просто пишут дату / время, когда флажок был установлен в поле БД "Required"
и ноль, когда не проверено.
В первом флажке все отлично работает со следующим конвертером:
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;
}
}
}
В последнем столбце я хотел сохранить дату и время в 2 разных поля "Required_Date"
а также "Required_Time" (String)
, Следующие IMultiConverter
был создан, чтобы справиться с этим:
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
};
}
}
При начальной загрузке колонка выглядит хорошо. В столбце проверены все соответствующие ячейки. Однако, когда значение проверено / снято, я получаю следующую ошибку привязки.
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')
Кроме того, когда я снимаю флажок с ячейки, она не снимается должным образом, и через некоторые точки останова в моем конвертере я замечаю, что значения поступают как DependencyProperty.Unset
(Вероятно, из-за обязательного предупреждения).
(9-30-12)
Я нашел более многообещающее лидерство в комментарии к коду:
"Причина, по которой MultiBindings не работают, заключается в том, что DataGridHelper.UpdateSource использует GetBindingExpression, а не GetBindingExpressionBase. Если это изменить, мульти-и приоритетные привязки должны работать".
Я попытался установить обновление на Explicit
и создать DataGrid_EndCellEdit
событие, которое вызывает BindingBaseExpression
обновить, но я думаю, что DataGridColumn игнорирует параметр обновления.
(10-12-12)
Все еще не повезло, я пытался работать с BindingBaseExpression
но безрезультатно. Очевидно, что IMultiValueCOnverter
связывание делает что-то странное.