1

我在 WPF 中实现了一个自定义日期转换器,这个想法是更聪明的日期输入,一个 la Outlook(能够输入“今天”等)所以我编写了自己的转换器,它正在工作。它将用户输入的格式设置为 M/d/yy 格式。例如,如果他们输入:8-2,他们将看到 8/2/09。迷人的。

问题是:用户可以输入几项最终导致相同日期的内容。(8-2 和 8/2,是简单的例子)。所以让我们假设他们从输入 8/2 开始,它通过 ConvertBack 和 Convert 运行,并显示为 8/2/09。到现在为止还挺好。现在假设他们在同一个字段中输入 8-2(或再次输入 8/2),紧随其后。它通过 ConvertBack 运行,它产生绑定属性中已经存在的 SAME 日期,因此它不需要运行 Convert,这意味着“8/2”就在文本框中。哎呀!没有数据问题,只是显示问题,但是嘿,整洁很重要。

如何强制 WPF 在所有(非错误)条目后运行转换?

这是转换器的简化版本:

    public class DateConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            string tempStr = value.ToString();
            return ((DateTime.Parse(tempStr)).ToString("M/d/yy"));
        }
        else
        {
            return null;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return DateTime.Parse(value.ToString());
    }

    #endregion
}

以下是它的用法:

      <local:FilteredTextBox.Text>
        <Binding Path="Value" ElementName="root" Converter="{StaticResource DateConv}" 
           UpdateSourceTrigger="LostFocus"  Mode="TwoWay" diagnostics:PresentationTraceSources.TraceLevel="High"
        NotifyOnValidationError="True" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
          <Binding.ValidationRules>
                <local:DateValidation/>
          </Binding.ValidationRules>
        </Binding>
      </local:FilteredTextBox.Text>

谢谢!斯科特

作为对以下评论的回应,这里是支持属性:

      public DateTime? Value
    {
        get
        {
            return (DateTime?)GetValue(ValueProperty);
        }
        set
        {
            SetValue(ValueProperty, value);
            OnPropertyChanged(new DependencyPropertyChangedEventArgs(ValueProperty, null, value)); // I just added this line, it makes no difference
        }
    }
4

2 回答 2

3

支持数据属性是否可能仅PropertyChanged在实际更改值时才触发?PropertyChanged无论值是否发生变化,您都可以在调用 set 函数时尝试触发。这将导致绑定被更新。

于 2009-04-22T21:19:29.267 回答
0

非常感谢 Josh G - 在他的帮助下,我找到了(或至少一个)答案。

这是针对我正在创建的 DatePicker 控件中的文本框。因此,我没有将文本框直接“锁定”到控件的值,而是创建了一个中间属性,然后将集合调用为依赖属性:

  public DateTime? DateValue
    {
        get
        {
            return _dateValue;
        }
        set
        {
            _dateValue = value;
            OnPropertyChanged("DateValue");
            SetValue(ValueProperty, _dateValue);
        }
    }

这完全可以正常工作。再次感谢,乔希!

于 2009-04-24T17:00:00.220 回答