我正在创建一个自动完成框,它使用有效值列表(对象,而不是字符串)。对象直接绑定,框(文本框和下拉部分)使用DisplayMemberPath来确定要显示为文本的内容。
我希望用户能够输入文本 - 如果文本与其中一个有效值不匹配,我希望它保留在框中并在视觉上标记为无效。
现在,当我绑定到视图模型时,显然我需要为这个无效值设置一些东西。我尝试将值设置为DependencyProperty.UnsetValue。这将返回到VM为空。
如果我后来要“清除”我的表单,我将VM属性设置为null,但当然这不会过滤到控件,因为值没有更改。
我原本希望Property系统注意到新值为null,旧值为UnsetValue,因此触发事件。
我错过了一些明显的东西吗?
由于
答案 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());
}
}