C# 更新失去焦点的日期选择器值

C# 更新失去焦点的日期选择器值,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

我在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" />

我想在失去焦点时验证日期如果我输入了错误的日期,我想更新它,但我无法这样做。请让我知道如何在失去焦点的情况下执行此操作。

我认为关于
绑定
更新资源记录器
存在一些混淆

首先,我将使用
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();
    }
}