2009-09-03 58 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不應該將值轉換爲兩種不同類型。這感覺就像一個黑客。但也許沒關係。我需要更多地考慮這一點。

相關問題