更新日期选择器值丢失焦点
本文关键字:焦点 日期 选择器 更新 | 更新日期: 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);
}
我想在上验证日期失去焦点如果我输入错误的日期,我想更新它,但我无法这样做。
我认为Binding
和UpdateSourceTrigger
有些混淆。
首先,我将像这样绑定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上观察文本。