それぞれバインディングを持つ 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_EndCellEdit
BindingBaseExpression
(10-12-12)
それでも運が悪いので、うまくBindingBaseExpression
いかなかった。明らかに、IMultiValueCOnverter
バインディングは奇妙なことをしています。