在 WPF 的 RadGridView 中从 RadDatePicker 双重调用 LostFocus 事件

Double Invokation of LostFocus event from RadDatePicker inside a RadGridView in WPF

我的用户控件中有一个 telerik:RadGridView,它有各种 列,我有一个 RadDatePicker 作为,

 <telerik:RadGridView Grid.Row="1" 
                Grid.Column="0"
                AutoGenerateColumns="False" 
                AutoExpandGroups="True" 
                IsReadOnly="False"
                ColumnWidth="*" 
                ItemsSource="{Binding DataModel.FlightDetailsList, Mode=TwoWay}" 
                IsFilteringAllowed="False" 
                IsSynchronizedWithCurrentItem="False" 
                SelectionMode="Single" 
                ShowGroupPanel="False">
            <telerik:RadGridView.Columns>


                <telerik:GridViewDataColumn Header="Date of Travel *" DataMemberBinding="{Binding FlightDate}">
                    <telerik:GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=FlightDate, Mode=OneWay, StringFormat=dd-MMM-yyyy}" />
                        </DataTemplate>
                    </telerik:GridViewColumn.CellTemplate>
                    <telerik:GridViewColumn.CellEditTemplate>
                        <DataTemplate>
                            <telerik:RadDatePicker SelectedDate="{Binding Path=FlightDate, Mode=TwoWay, StringFormat=dd-MMM-yyyy, UpdateSourceTrigger=LostFocus}" DisplayFormat="Short" Culture="en-AU" />
                        </DataTemplate>
                    </telerik:GridViewColumn.CellEditTemplate>
                </telerik:GridViewDataColumn>
            </telerik:RadGridView.Columns>
        </telerik:RadGridView>

在这里,如果你看到我的集合 FlightDetailsList 是数据绑定到 网格。 telerik:RadDatePicker 绑定到 FlightDate 属性。

我想调用 FlightDate 属性 的 属性 更改,所以在 我订阅的视图模型喜欢,

 private void FlightDetailsListCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
            var _obj = (e.NewItems[0] as FlightDtls);
            if (_obj != null)
                (e.NewItems[0] as FlightDtls).PropertyChanged += new PropertyChangedEventHandler(FlightDtlsPropertyChanged);
        }

    }

    private void FlightDtlsPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        var data = sender as FlightDtls;
        if (data != null && string.Equals(e.PropertyName, "FlightDate", StringComparison.InvariantCultureIgnoreCase) && IsValidateFltDt && (DateTime.Now.Date - data.FlightDate.Value.Date).TotalDays > 2)
        {
            CommonMethods.ShowAlertMessage("The Date of Travel in Flight Routing must be no less than 2 days!", MessageBoxImage.Exclamation);
        }
    }

I am facing problem with, whenever I used to change the date using datepicker the propertychanged event is trigerring twice. whereas if I am editing the date via keyboard the even is trigerring once as expected. How can I avoid the double invocation when selecting from the datepicker.

将列的类型更改为 GridViewColumn:

<telerik:GridViewColumn Header="Date of Travel *">
    <telerik:GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=FlightDate, Mode=OneWay, StringFormat=dd-MMM-yyyy}" />
        </DataTemplate>
    </telerik:GridViewColumn.CellTemplate>
    <telerik:GridViewColumn.CellEditTemplate>
        <DataTemplate>
            <telerik:RadDatePicker SelectedDate="{Binding Path=FlightDate, Mode=TwoWay, StringFormat=dd-MMM-yyyy, UpdateSourceTrigger=LostFocus}" DisplayFormat="Short" Culture="en-AU" />
        </DataTemplate>
    </telerik:GridViewColumn.CellEditTemplate>
</telerik:GridViewColumn>