2009-04-22 40 views
1

我在WPF中实现了一个自定义日期转换器,这个想法更加巧妙地约会日期条目,一个Outlook(能够输入“今天”等)所以我写了我自己的转换器,这是工作。它以M/d/yy格式格式化用户的输入。例如,如果他们输入:8-2,他们会看到8/2/09。可爱。强制转换为在WPF中使用自定义转换器时始终运行?

问题是:用户可以输入的最终结果是相同的日期。 (8-2和8/2,简单的例子)。所以我们只是说他们首先输入8/2,然后运行ConvertBack和Convert,并显示为8/2/09。到现在为止还挺好。现在我们假设他们在同一个领域中输入8-2(或者8/2),之后。虽然通过ConvertBack运行,这会产生绑定属性中已存在的SAME日期,所以不需要运行Convert,这意味着“8/2”位于文本框中。益!没有数据问题,只是一个显示,但嘿,整洁计数。

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

这里的转换器的简化版本:

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

回答

0

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

这是我创建的DatePicker控件中的文本框。因此,而不是直接“锁定”文本框控件的值,我创建了一个中间属性,然后调用设置为依赖属性:

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

,这完全适用,因为它应该。再次感谢乔希!

3

有没有可能是后台数据属性仅发射PropertyChanged,如果它实际上改变了价值?无论值是否更改,只要调用set函数,就可以尝试执行PropertyChanged。这会导致绑定被更新。

+0

在这种情况下,支持数据属性始终使用SetValue设置DependencyProperty的值(这用于自定义控件中)。我添加了上面的代码。而且为了确保,我也打电话给OnPropertyChanged - 没有任何改变!老鼠! – 2009-04-23 23:56:34