WPF控件具有“无效”值

时间:2012-04-25 09:25:33

标签: .net wpf .net-4.0 dependency-properties

我正在创建一个自动完成框,它使用有效值列表(对象,而不是字符串)。对象直接绑定,框(文本框和下拉部分)使用DisplayMemberPath来确定要显示为文本的内容。

我希望用户能够输入文本 - 如果文本与其中一个有效值不匹配,我希望它保留在框中并在视觉上标记为无效。

现在,当我绑定到视图模型时,显然我需要为这个无效值设置一些东西。我尝试将值设置为DependencyProperty.UnsetValue。这将返回到VM为空。

如果我后来要“清除”我的表单,我将VM属性设置为null,但当然这不会过滤到控件,因为值没有更改。

我原本希望Property系统注意到新值为null,旧值为UnsetValue,因此触发事件。

我错过了一些明显的东西吗?

由于

2 个答案:

答案 0 :(得分:2)

您可以为无效值创建自己的标记对象,而不是设置对WPF框架具有特殊含义的DependencyProperty.UnsetValue,例如

public static Object Dummy = new Object();

您应该使用与有效值相同的类,而不是Object。现在,当您重置VM时,该值将真正改变,WPF将注意到差异。

答案 1 :(得分:0)

一种简单且独立于验证框架的方法是让VM完成工作。

E.g。

public class MyVM : MyBaseVM
{
    private ObservableCollection<Object> _items
        = new ObservableCollection<Object>();
    public ObservableCollection<Object> Items
    {
        get
        {
            return _items;
        }
    }

    private string _text;
    public string Text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            Validate();

            if (_isValid)
                _model.Text = value;

            NotifyPropertyChanged("Text");
        }
    }

    private bool _isValid = true;
    public bool IsValid
    {
        get
        {
            return _isValid;
        }
        private set
        {
            _isValid = value;
            NotifyPropertyChanged("IsValid");
        }
    }

    private void Validate()
    {
        IsValid = _items.Any(i =>
            i.ToString().ToLower() == _text.ToLower().Trim());
    }
}