2009-04-22 8 views
1

私は、日付入力、Outlook(「今日」などを入力できるようになっています)にもっと賢いアイデアをWPFで実装していますので、私自身のコンバータを作成しました。これは動作しています。ユーザーの入力をM/d/yyの形式でフォーマットします。たとえば、8-2と入力すると、8/2/09が表示されます。美しい。WPFでカスタムコンバータを使用しているときに強制的に変換を実行しますか?

質問は次のとおりです。ユーザーが入力できる項目がいくつかあり、最終的に同じ日付になります。 (8-2と8/2は簡単な例です)。ですから、ConvertBackとConvertで実行され、8/2/09として表示される8/2を入力することから始めるとしましょう。ここまでは順調ですね。今度は同じフィールドに8-2(または8/2)を入力したとしましょう。 ConvertBackを実行すると、バインドされたプロパティにすでにあるSAMEの日付が返されるため、Convertを実行するのは面倒ではありません。つまり、「8/2」がテキストボックスに表示されます。イック!データの問題はなく、ディスプレイだけですが、ちょっと、すっきりしています。

すべての(エラーではない)エントリの後に変換を実行するにはどうすればよいですか?ここで

は、コンバータの簡易版です。

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

、ここではそれを使用すると、次のようになります!以下のコメントを受けて スコット

は、ここでのバッキングプロパティがあります:

 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

多くのおかげでジョシュ・G - 彼の助けを借りて、(または少なくとも)答えを見つけました。

これは、作成しているDatePickerコントロール内のテキストボックス用です。

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

、それが必要として、これは完全に動作します:だから、むしろコントロールの値に直接テキストボックスを「ロック」よりも、私は、依存関係プロパティに設定を呼び出す中間の性質を、作成しました。ありがとう、ジョシュ!

3

は、それが実際に値を変更した場合、バッキングデータプロパティのみPropertyChangedを発射していることは可能ですか?値が変化するかどうかにかかわらず、set関数が呼び出されるたびにPropertyChangedを呼び出すことができます。これにより、バインディングが更新されます。

+0

この場合、バッキングデータプロパティは常にSetValueを使用してDependencyProperty(カスタムコントロールで使用される)の値を設定します。上記のコードを追加しました。そして確かに、私はOnPropertyChangedを後で呼びました - 変更はありません!ラット! –

+0

申し訳ありませんが、ソースで依存関係プロパティを使用していることを認識しませんでした。それはこの答えを無関係にします。 –

関連する問題