简体   繁体   English

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

[英]Datepicker ValidationRules from code behind: validation rule not called on user input

I'm creating a wpf UserControl that contains a Datepicker. 我正在创建一个包含Datepicker的wpf UserControl。 This datepicker is generated from code behind in c#. 此日期选择器由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;
    }

The fact is that the validation rule is never called when I manualy enter a date in the DatePicker text field (But it's called when using the datepicker). 事实是,当我在DatePicker文本字段中手动输入日期时,永远不会调用验证规则(但使用datepicker时会调用该规则)。 The only thing I got is a FormatException on lost focus. 我唯一得到的是失去焦点的FormatException。

Any idea? 任何想法? Thanx. 感谢名单。

One possibility is to use converter: 一种可能性是使用转换器:

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;
    }
}

You can use it like this to bind to public DateTime? DateTime 您可以像这样使用它绑定到public DateTime? DateTime public DateTime? DateTime property: public DateTime? DateTime属性:

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

ConvertBack will be called on lost focus. 失去焦点时将调用ConvertBack

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM