C# 更新失去焦点的日期选择器值
我在wpf中有一个自定义日期选择器,下面是代码xamlC# 更新失去焦点的日期选择器值,c#,wpf,xaml,C#,Wpf,Xaml,我在wpf中有一个自定义日期选择器,下面是代码xaml <local:Customdatepicker x:Uid="dateValue" x:Name="dateValue" BorderThickness="0" Visibility="{Binding ShowDatePicker, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding FieldValueIsEditable, U
<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" />
我想在失去焦点时验证日期如果我输入了错误的日期,我想更新它,但我无法这样做。请让我知道如何在失去焦点的情况下执行此操作。我认为关于
绑定
和更新资源记录器
存在一些混淆
首先,我将使用x:Name
像这样绑定SelectedValue
查看:
<DatePicker SelectedDate="{Binding Path=SelDate, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
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)
}
}
通过这个简单的绑定
您的视图日期选择器与您的视图模型属性具有相同的值
现在可以在setter
(请参阅注释)中进行验证,或者使用OnLostFocus
。如果您尝试在setter中进行验证,您必须提到每个更改都会调用setter
第二种可能性是如下设置视图绑定:
<DatePicker SelectedDate="{Binding Path=SelDate, UpdateSourceTrigger=LostFocus, Mode=TwoWay}">
视图模型:
...
public string DateText {
get { return _dateText; }
set {
if (value == _dateText) return;
_dateText = value;
OnPropertyChange();
}
}
注意:如果字符串为
sadfs
,则在LostFocus an上自动更改的文本值为空。。。。但是有了它,你可以在setter上观察文本。我希望这会有所帮助。您将验证什么?格式是否正确,或输入的日期是否在给定范围内?我将在Customdatepicker
类中重写protected override void OnLostFocus(RoutedEventArgs e)
方法,并使用DependencyProperties
定义验证范围或类似的内容。也许您可以添加验证算法。@WPFGermany没有使用这个“LostFocus=”dateValue\u LostFocus“,我只是尝试了这个“Text=“{Binding DateFieldValue,Mode=TwoWay,UpdateSourceTrigger=LostFocus”“因此,安装了属性chnaged后,我使用的不是失去焦点…但我可以同时使用这两种功能,即属性更改和失去焦点…因为我还需要更新的值..谢谢,我得到了它,但当我更新datepicker文本框中的任何值时,问题来了,例如,我输入了“sdfsdfds”,而不是“30.3.2016”但是当我按下失去焦点时,我没有得到我再次输入的值,即“sdfsdfds”更新值。你知道我如何得到@WPFGermanyyes吗?请看我发布的问题,我在xaml中使用了这个问题。但现在的问题是,当我在textbox中输入任何字符串时,它会将null返回到属性“DateText”但是当我输入任何数字值时,它会返回日期/值,即加载到列表中的日期/值。您收到了吗。我需要任何类型的更新值,这是PropertyChanged
和LostFocus
之间的区别。在LostFocus
控件执行内部检查并删除没有有效时间字符串的字符串。如果使用属性更改
绑定,则会得到每个更改
/键入的字符
(您可以通过向setter添加断点来看到这一点)。当您失去焦点时,将使用空值再次执行setter(这是来自控件的自动设置).如果你想在这两者之间施展魔法,你需要在二传中施展魔法。非常感谢@WPFGermany的精彩解释..但我一直认为只有在失去焦点的情况下我有价值时才能施展魔法…休息,我会尝试更多
<DatePicker Text="{Binding DateText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
...
public string DateText {
get { return _dateText; }
set {
if (value == _dateText) return;
_dateText = value;
OnPropertyChange();
}
}