更新日期选择器值丢失焦点

本文关键字:焦点 日期 选择器 更新 | 更新日期: 2023-09-27 18:13:24

我有一个自定义日期选择器在wpf下面是代码xaml

<local:Customdatepicker x:Uid="dateValue" 
    x:Name="dateValue" 
    BorderThickness="0" 
    Visibility="{Binding ShowDatePicker, UpdateSourceTrigger=PropertyChanged}" 
    IsEnabled="{Binding FieldValueIsEditable, UpdateSourceTrigger=PropertyChanged}"                                                DateCoordinates="{Binding CoOrdinates, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
    Text="{Binding DateFieldValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, TargetNullValue=''}"   
    Loaded="dateValue_Loaded" 
    Style="{StaticResource DatePickerStyle}" 
    Width="{Binding DatePickerWidth, UpdateSourceTrigger=PropertyChanged}"                                                MouseDoubleClick="dateValue_MouseDoubleClick"  
    DisplayDate="{Binding DisplayDateFieldValue, Mode=TwoWay}"
    LostFocus="dateValue_LostFocus" />

public class Customdatepicker : DatePicker {
    public Customdatepicker() {
        DefaultStyleKey = typeof(DatePicker);
    }
    public _Coordinates DateCoordinates {
          get { return (_Coordinates) GetValue(CoordinatesProperty); }
          set { SetValue(CoordinatesProperty, value); }
    }
    public static readonly DependencyProperty CoordinatesProperty =
        DependencyProperty.Register("DateCoordinates", typeof(_Coordinates), typeof(Customdatepicker), null);
}

我想在上验证日期失去焦点如果我输入错误的日期,我想更新它,但我无法这样做。

更新日期选择器值丢失焦点

请告诉我如何在LOST FOCUS上做到这一点。

我认为BindingUpdateSourceTrigger有些混淆。

首先,我将像这样绑定SelectedValue,而不是使用x:Name

视图:

<DatePicker SelectedDate="{Binding Path=SelDate, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

ViewModel:

private DateTime _selDate;
public DateTime SelDate {
    get { return _selDate; }
    set {
        if (value.Equals(_selDate)) return;
        /*
            here you could validate
        */
        _selDate = value;
        OnPropertyChanged(); //this updates view if changes done programmatically in your ViewModel (that implements INotifyPropertyChanged)
    }
}

使用这个简单的Binding,您的views DatePicker具有与viewmodels属性相同的值。

您的验证现在可以在setter(见注释)中完成,或者您使用OnLostFocus。如果你尝试在setter中进行验证,你必须提到每个更改都调用setter。

第二种可能是这样设置视图绑定:
<DatePicker SelectedDate="{Binding Path=SelDate, UpdateSourceTrigger=LostFocus, Mode=TwoWay}">
当DatePicker失去焦点时,视图模型中的setter将被调用。然后您可以在setter中验证,它将在LostFocus中执行。

希望对理解有帮助。

编辑:

对于当前文本,您可以在Text上添加几个Binding:

<DatePicker Text="{Binding DateText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

viewmodel:

...
public string DateText {
    get { return _dateText; }
    set {
        if (value == _dateText) return;
        _dateText = value;
        OnPropertyChange();
    }
}

说明:如果字符串为sadfs ....,则在LostFocus上自动更改的文本值为Empty但你可以在setter上观察文本。