2009-09-03 7 views
1

Valueという文字列を持つDateFieldというクラスがあります。あなたが有効な日付に解析できる文字列にこのプロパティを設定すると、プロパティのセッターは、例えば、適切にフォーマットされた日付に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

完了;詳細は私の答えを見てください。 –

1

両方を実装するべきだと思います。

ValueConverterを使用する典型的なパターンは、解析が成功した場合は変換された値を返し、失敗した場合はDependencyProperty.UnsetValueです。私はそれをすることはできません。私がそうするならば、束縛されたValueプロパティは設定されません。したがって、値は検証されず、検証エラーもUIに表示されません。

代わりに、DateValueConverterメソッドのConvertBackメソッドが、解析されたDateTimeまたは変換に失敗した文字列を返すクラスを実装しています。 (実際には、Fieldクラスでそれが由来です)私のDateTimeFieldクラスのValueプロパティには、次のようになります。

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

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

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

Validate方法は、基本的には、渡される値の型になります。それはDateTimeだ場合には、それは有効です。文字列の場合はそうではありません。

ValueConverterは2つの異なるタイプに値を変換しないように思われるため、私はこれに満足していません。それはハックのように感じる。しかし大丈夫かもしれません。私はこれについてもっと考えなければならない。

関連する問題