我有 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>
绑定只是将选中框的日期/时间写入 db 字段"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)
我在 codeplex 评论中发现了一个更有希望的线索:
“MultiBindings 不起作用的原因是 DataGridHelper.UpdateSource 使用 GetBindingExpression 而不是 GetBindingExpressionBase。如果更改此设置,则 multi 和优先级绑定应该可以工作。”
我试图将更新设置为Explicit
并创建一个DataGrid_EndCellEdit
调用BindingBaseExpression
更新的事件,但我认为 DataGridColumn 忽略了更新选项。
(10-12-12)
仍然没有运气,我尝试使用BindingBaseExpression
无济于事。显然IMultiValueCOnverter
绑定正在做一些奇怪的事情。