1

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

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

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

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

我本来希望 Property 系统注意到新值为 null 而旧值为 UnsetValue 并因此触发该事件。

我错过了什么明显的东西吗?

谢谢

4

2 回答 2

2

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

public static Object Dummy = new Object();

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

于 2012-05-07T22:28:23.383 回答
0

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

例如

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());
    }
}
于 2012-05-06T16:59:46.860 回答