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

我认为您应该使用转换器并同时实现 theConvertConvertBack方法

于 2009-09-03T06:22:24.283 回答
1

我认为我的工作正常,但我对自己的工作方式并不完全满意。

使用 a 的典型模式ValueConverter是,ConvertBack如果解析成功,则应该返回转换后的值,如果解析DependencyProperty.UnsetValue失败。我不能那样做。如果我这样做,则绑定Value属性不会被设置。因此该值不会得到验证,并且 UI 中不会显示任何验证错误。

我所做的是实现一个DateValueConverter类,其ConvertBack方法返回 parsedDateTime或它尝试转换失败的字符串。Value我的类中的属性DateTimeField(实际上,在Field它派生的类中)如下所示:

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

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

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

Validate方法基本上只是查看传入的值的类型:如果是 a DateTime,那么它是有效的;如果它是一个字符串,它不是。

我对此不满意,因为它似乎ValueConverter不应该将一个值转换为两种不同的类型。感觉就像一个黑客。但也许没关系。我需要再考虑一下。

于 2009-09-03T22:02:57.303 回答