1

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 として受信されています。

前もって感謝します

4

1 に答える 1

3

x:Nameあなたのコントロールに設定してくださいDatePicker-

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <DatePicker x:Name="datePicker" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

そして、このようにコード ビハインドで DatePicker コントロールをフェッチできます -

ContentPresenter contentPresenter = e.EditingElement as ContentPresenter;
DataTemplate editingTemplate = contentPresenter.ContentTemplate;
DatePicker dp = editingTemplate.FindName("datePicker", contentPresenter)
                            as DatePicker ;
于 2012-11-27T18:26:53.340 に答える