1

我有 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绑定正在做一些奇怪的事情。

4

0 回答 0