私は、日付入力、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
}
}
この場合、バッキングデータプロパティは常にSetValueを使用してDependencyProperty(カスタムコントロールで使用される)の値を設定します。上記のコードを追加しました。そして確かに、私はOnPropertyChangedを後で呼びました - 変更はありません!ラット! –
申し訳ありませんが、ソースで依存関係プロパティを使用していることを認識しませんでした。それはこの答えを無関係にします。 –