我有一个具有属性的ViewModel。 此属性是“ PhysicalValue”。该PhysicalValue是一个由值和单位组成的类。
[...]
<dxe:TextEdit EditValue="{Binding Target.Value, ValidatesOnDataErrors =true}"></dxe:TextEdit>
[...]
我有一个控件应该编辑此PhysicalValue的值:
Target.Value
但是我没有错(可能是因为它搜索Target
时出错。我尝试了另一种方法,直接绑定到this.localData.forEach(x => {
x.DataSource = x.DataSource ? '' || 'XXX' : 'MyVAL'
});
,但这是行不通的,因为我需要将convertBack转换为已知最初用于重建PhysicalValue的单位。
您将如何解决?
答案 0 :(得分:1)
TextEdit 控件的 EditValue 属性绑定到PhysicalValue.Value
。将Binding.ValidatesOnDataErrors
设置为true时,绑定引擎将检查具有target属性的类是否实现IDataErrorInfo
。
为此,PhysicalValue
类需要实现IDataErrorInfo
:
class PhysicalValue : IDataErrorInfo
{
public double Value { get; set; }
public object Unit { get; set; }
public string Error => this["Value"] + this["Unit"];
public PhysicalValue(int v, object u)
{
Value = v;
Unit = u;
}
public string this[string columnName]
{
get
{
if (columnName == "Value")
{
if (Value > 5000)
{
return "out of spec value";
}
}
return String.Empty;
}
}
}
如果PhysicalValue类无法保存验证逻辑或无法实现IDataErrorInfo
接口,则可以创建一个处理验证的代理类并绑定到该代理类。这是一个小例子:
class PhysicalValueValidator : IDataErrorInfo
{
private readonly PhysicalValue _physicalValue;
private double _maxValue;
public double Value
{
get { return _physicalValue.Value; }
set { _physicalValue.Value = value; }
}
public PhysicalValueValidator(PhysicalValue pv)
{
_physicalValue = pv;
_maxValue = 5000;
}
public void SetMaxValue(double maxValue)
{
_maxValue = maxValue;
}
public string this[string columnName]
{
get
{
if (columnName == "Value")
{
if (Value > _maxValue)
{
return "out of spec value";
}
}
return String.Empty;
}
}
public string Error => this["Value"];
}
PhysicalValueValidator
类公开了SetMaxValue(..)
方法,以从窗格viewmodel更新验证逻辑。视图模型可能如下所示:
class MyViewModel
{
private PhysicalValue _target;
public PhysicalValueValidator TargetValidator { get; }
public MyViewModel()
{
_target = new PhysicalValue(5, 10);
TargetValidator = new PhysicalValueValidator(_target);
// update validation Logic...
TargetValidator.SetMaxValue(6000);
}
}
在您的xaml代码中,绑定到TargetValidator.Value而不是Target.Value。
有关IDataErrorInfo的更多信息,请检查以下链接:IDataErrorInfo