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

时间:2009-04-22 21:10:30

标签: wpf converter

我正在WPF中实现一个自定义日期转换器,想要更加聪明的日期条目,一个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
        }
    }

2 个答案:

答案 0 :(得分:3)

如果支持数据属性实际更改值,那么它是否可能仅触发PropertyChanged?无论值是否发生变化,只要调用set函数,您就可以尝试触发PropertyChanged。这将导致更新绑定。

答案 1 :(得分:0)

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

这是我正在创建的DatePicker控件中的文本框。因此,我不是直接将文本框“锁定”到控件的值,而是创建了一个中间属性,THEN将该属性调用为依赖属性:

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

这完全可行。再次感谢,乔希!