LOST FOCUS更新日期选择器值

时间:2016-10-18 06:13:04

标签: c# wpf xaml

我在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上做到这一点。

1 个答案:

答案 0 :(得分:1)

我认为BindingUpdateSourceTrigger存在一些混淆。

首先,我会使用SelectedValue来绑定x:Name,而不是<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)
    }
}

<强>视图模型:

Binding

通过这个简单的setter 视图,DatePicker与 viewmodels 属性具有相同的值。

您现在可以在OnLostFocus(请参阅评论)中进行验证,或者使用<DatePicker SelectedDate="{Binding Path=SelDate, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"> 。如果你在setter中尝试验证,你必须提到每个更改都会调用setter。

第二种可能性是设置视图绑定,如下所示:

setter

这样,当DatePicker失去焦点时,就会调用 viewmodel 中的setter。然后,您可以在LostFocus中进行验证,并在Binding处执行。

希望有助于理解。

修改

对于当前文字,您可以在Text上添加多个<DatePicker Text="{Binding DateText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

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

视图模型:

sadfs

注意:如果字符串为<b>asserted</b>,则LostFocus上的文本值会自动更改为空。但是,您可以在设置器处观察文本。我希望有所帮助。