在WPF中使用自定义转换器时强制转换为始终运行?

在WPF中使用自定义转换器时强制转换为始终运行?,wpf,converter,Wpf,Converter,我正在WPF中实现一个自定义的日期转换器,这个想法是为了更聪明地输入日期,一个la Outlook(能够输入“今天”,等等),所以我编写了自己的转换器,它正在工作。它将用户条目的格式设置为M/d/yy。例如,如果他们输入:8-2,他们将看到8/2/09。可爱 问题是:用户可以输入一些最终导致相同日期的内容。(8-2和8/2是简单的例子)。让我们假设他们从输入8/2开始,它通过ConvertBack和Convert运行,显示为8/2/09。到现在为止,一直都还不错。现在让我们假设他们在同一个字段中

我正在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运行,它生成的日期与绑定属性中已经存在的日期相同,因此不必运行Convert,这意味着“8/2”位于文本框中。哎呀!没有数据问题,只是一个显示问题,但是,整洁很重要

如何强制WPF在所有(无错误)条目之后运行Convert

以下是转换器的简化版本:

    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>

如果备份数据属性实际更改了值,它是否可能仅触发
PropertyChanged
?无论值是否更改,只要调用set函数,都可以尝试触发
PropertyChanged
。这将导致绑定更新。

多亏了Josh G-在他的帮助下,我找到了(或至少找到了)答案

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

      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
        }
    }
  public DateTime? DateValue
    {
        get
        {
            return _dateValue;
        }
        set
        {
            _dateValue = value;
            OnPropertyChanged("DateValue");
            SetValue(ValueProperty, _dateValue);
        }
    }

这完全是应该的。再次感谢你,乔希

在这种情况下,backing data属性始终使用SetValue设置DependencyProperty的值(在自定义控件中使用)。我在上面添加了代码。为了确保这一点,我打电话给了Property,后来也改变了——没有改变!胡扯!抱歉,我没有意识到您正在源上使用依赖项属性。这使得这个答案无关紧要。