1

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

    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");
        }
    }

このフィールドにバインドされた TextBox を作成します。

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

たとえば、"010109"このフィールドに入力してタブから移動すると、プロパティがこの文字列にBinding適切に設定されます。Valueプロパティ セッターが実行され、_Value正しく設定され"01/01/2009"(TryParseこのクラスの実装は、受け入れられるものよりも少しカトリック的DateTime.TryParseです)、PropertyChangedイベントが発生します。リストに登録されている別のオブジェクトが更新されるため、この最後のビットが発生していることはわかっています。

しかし、そうでTextBoxはありません。なぜだめですか?私は設定Valueしました、私は上げましたPropertyChanged; 私はこれ以上何をする必要がありますか?

4

2 に答える 2

2

コンバーターConvertを使用して、メソッドとConvertBackメソッドの両方を実装する必要があると思います

于 2009-09-03T06:22:24.283 に答える
1

私はこれが適切に機能していると思いますが、私はそれをどのように行ったかに完全に満足しているわけではありません。

aを使用する一般的なパターンは、解析が成功した場合と失敗した場合に、が変換された値を返す必要ValueConverterがあるというものです。できません。そうすると、バインドされたプロパティが設定されません。そのため、値は検証されず、UIに検証エラーは表示されません。ConvertBackDependencyProperty.UnsetValueValue

代わりに私が行ったことは、メソッドが解析された、または変換に失敗した文字列のいずれかを返すDateValueConverterクラスを実装したことです。私のクラス(実際には、それが派生したクラス)のプロパティは次のようになります。ConvertBackDateTimeValueDateTimeFieldField

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

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

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

このValidateメソッドは基本的に、渡される値のタイプを調べるだけDateTimeです。それが、の場合、それは有効です。文字列の場合はそうではありません。

ValueConverter値を2つの異なるタイプに変換するべきではないように思われるため、これには満足していません。それはハックのように感じます。しかし多分それは大丈夫です。これについてもう少し考える必要があります。

于 2009-09-03T22:02:57.303 に答える