来自代码的Datepicker ValidationRules:未在用户输入上调用验证规则

时间:2017-05-04 12:02:04

标签: c# wpf validation datepicker

我正在创建一个包含Datepicker的wpf UserControl。此日期选择器是从c#中的代码生成的。

public partial class EditorDatePicker : UserControl
{
    public EditorDatePicker(TagEntry element, bool isTagPresent)
    {
        InitializeComponent();

        // datepicker binding and validation
        Binding binding = new Binding();

        binding.Path = new PropertyPath("DateDict[" + element.ParentTag + element.ChildTag + "]");
        binding.NotifyOnValidationError = true;
        binding.ValidatesOnDataErrors = true;
        binding.Converter = new DateTimeConverter();
        binding.Mode = BindingMode.TwoWay;
        binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        binding.ValidationRules.Add(new DateValidationRule());

        this.datePicker.SetBinding(DatePicker.SelectedDateProperty, binding);
    }


class DateTimeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        if (value != null)
        {
            try
            {
                DateTime test = (DateTime)value;
                string date = test.ToString("d/M/yyyy");
                return (date);
            }
            catch
            {
                return null;
            }
        }
        return null;
    }

事实上,当我在DatePicker文本字段中手动输入日期时,永远不会调用验证规则(但是在使用datepicker时调用它)。我唯一得到的是失去焦点的FormatException。

有什么想法吗?感谢名单。

1 个答案:

答案 0 :(得分:0)

一种可能性是使用转换器:

public class DateTimeNullConverter : MarkupExtension, IValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider) => this;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is DateTime)
            return value.ToString();
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var text = value as string;
        DateTime result;
        if (text != null && DateTime.TryParse(text, out result))
            return result;
        return null;
    }
}

您可以像这样使用它绑定到public DateTime? DateTime属性:

<TextBox Text="{Binding DateTime, Converter={local:DateTimeNullConverter}}" />

ConvertBack会因失去焦点而被召唤。