WPF DataGrid の CellEditEnding イベントを使用してデータを検証し、他の計算を実行しています。DataGridTemplateColumns として TextBoxes と DatePickers があります。
イベントハンドラーを呼び出す方法は次のとおりです
private void OnCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if (e.EditAction == DataGridEditAction.Cancel) return;
DataGridCellEditEndingCommandParameter p = new DataGridCellEditEndingCommandParameter();
if (e.Column != null)
{
p.BindingPropertyName = e.Column.SortMemberPath;
if (e.Column.Header != null)
p.ColumnHeaderName = e.Column.Header.ToString();
}
TextBox t = e.EditingElement as TextBox;
if (t != null)
p.EndingElementValue = t.Text;
//else if (e.EditingElement as DatePicker)
if (e.Row != null) p.RowItem = e.Row.Item;
p.EventArgs = e;
p.Sender = sender as DataGrid;
CommandParameter = p;
ExecuteCommand();
}
EditingElement を TextBox として変換して、ユーザーが入力した値を読み取ります。DatePicker についても同じことを行いますが、DatePicker を編集すると null になります。
<DataGridTemplateColumn x:Name="fxFwd" Header="Value Date" Width="70" SortMemberPath = "fwFwdDate" CanUsersort = "True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= fxFwdDate,
ConverterCulture={x:Static gl:CultureInfo.CurrentCulture},
StringFormat=\{0:d\}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding Path=fxFwdDate,
ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}, Mode=TwoWay,
ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
DatePicker の値を変更した後に EditingElement を調べたところ、DatePicker ではなく ContentPresenter として受信されています。
前もって感謝します