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"ない場合は null を書き込みます。

最初のチェックボックスでは、次のコンバーターですべてがうまく機能します。

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 が GetBindingExpressionBase ではなく GetBindingExpression を使用しているためです。これを変更すると、複数の優先バインディングが機能するはずです。」

更新を設定して更新を呼び出すイベントをExplicit作成しようとしましたが、DataGridColumn が更新オプションを無視していると思います。DataGrid_EndCellEditBindingBaseExpression

(10-12-12)

それでも運が悪いので、うまくBindingBaseExpressionいかなかった。明らかに、IMultiValueCOnverterバインディングは奇妙なことをしています。

4

0 に答える 0