2009-09-03 61 views
1

我有一个类,名为DateField,它具有字符串Value属性。如果将此属性设置为可以被解析成一个有效日期的字符串,该属性设置器Value到正确格式化的日期,例如:WPF双向绑定:我如何使用它刚刚设置的值的格式化版本更新TextBox?

private string _Value; 
    public string Value 
    { 
     get 
     { 
      return _Value; 
     } 
     set 
     { 
      if (value == _Value) 
      { 
       return; 
      } 
      object result; 
      if (TryParse(value, out result)) 
      { 
       _Value = Format(result); 
      } 
      else 
      { 
       _Value = value; 
      } 
      OnPropertyChanged("Value"); 
     } 
    } 

我创建一个绑定到该领域的文本框:

<DataTemplate DataType="{x:Type m:DateField}"> 
     <TextBox           
       IsTabStop="True" 
       Text="{Binding Value, Mode=TwoWay, ValidatesOnDataErrors=True}"> 
     </TextBox> 
    </DataTemplate> 

当我在此字段中输入"010109"并将其选中时,BindingValue属性适当地设置为此字符串。属性设置器运行时,_Value被正确设置为"01/01/2009"(该类中的TryParse实现在它接受的内容上比在DateTime.TryParse更接近天主教),并且PropertyChanged事件得到提升。我知道最后一点发生了,因为订阅了列表的另一个对象被更新了。

但是TextBox没有。为什么不?我已经设置了Value,我已经提出了PropertyChanged;我还需要做些什么?

回答

2

我认为你应该使用一个converter并同时实现ConvertConvertBack方法

+0

完成;详情请参阅我的答案。 – 2009-09-03 22:09:05

1

我觉得我有这个工作正常,但我不是如何我已经做到了完全满意。

使用ValueConverter的典型模式是ConvertBack应该在解析成功时返回转换后的值,如果失败则返回DependencyProperty.UnsetValue。我不能那样做。如果我这样做,绑定的Value属性不会被设置。所以这个值没有被验证,并且UI中没有显示验证错误。

我做的是实现DateValueConverter类,它的ConvertBack方法返回解析的DateTime或它未成功尝试转换的字符串。在我DateTimeField类(实际上,在Field类它源自)的Value属性看起来是这样的:

public object Value 
{ 
    get 
    { 
     return _Value; 
    } 
    set 
    { 
     if (value == _Value) 
     { 
      return; 
     } 

     if (!Validate(value)) 
     { 
      return; 
     } 

     _Value = value; 
     OnPropertyChanged("Value"); 
    } 
} 

Validate方法基本上是着眼于正在传递的值的类型:如果它是一个DateTime,那么它是有效的;如果它是一个字符串,它不是。

我对此并不满意,因为它看起来像一个ValueConverter不应该将值转换为两种不同类型。这感觉就像一个黑客。但也许没关系。我需要更多地考虑这一点。

相关问题