就像这样,我有一个 wpf 绑定
<TextBox
Name="txtRackNo"
Grid.Column="5"
Grid.ColumnSpan="7"
Grid.Row="4"
Grid.RowSpan="1"
Style="{StaticResource ResourceKey=styleValidationTextBox}"
Text="{Binding Path=rack_no, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}">
</TextBox>
如果我实现 IDataErrorInfo 并直接在我的视图模型中拥有属性,那么它可以工作,它会显示工具提示和红色验证框。
如果我在作为视图模型属性的类中实现 IDataErrorInfo,则样式会创建工具提示,但不会显示红色错误框。我确信我的风格是有效的,只是如果我改变这条线
Text="{Binding Path=rack_no, Mode=TwoWay, ...}"
使用我的数据类型“RACK”
Text="{Binding Path=rack.rack_no, Mode=TwoWay, ...}"
private Rack _rack;
public Rack rack
{
get { return _rack; }
set
{
_rack = value;
createPropertyObserver();
base.RaisePropertyChanged("rack");
}
}
然后它只显示工具提示而不是红色验证错误框。
编辑:这里有更多代码,也许这会帮助别人更好地理解我的问题?
class Rack : ObservableObject, IDataErrorInfo
{
public String _rack_no;
public String rack_no
{
get { return _rack_no; }
set
{
if (value != null)
{
_rack_no = value;
base.RaisePropertyChanged("rack_no");
}
}
}
public String Error
{
get { return this[null]; }
}
public String this[String propertyName]
{
get
{
String result = String.Empty;
propertyName = propertyName ?? String.Empty;
if (propertyName == String.Empty || propertyName == "dc_name")
{
if (String.IsNullOrEmpty(this.dc_name))
{
result += "Datacenter name is mandatory." + Environment.NewLine;
}
}
if (propertyName == String.Empty || propertyName == "rack_no")
{
if (String.IsNullOrEmpty(this.rack_no) || this.rack_no.Length > 5)
{
result += "Rack number is mandatory and must be 5 letters or less."
+ Environment.NewLine;
}
}
Debug.WriteLine(result);
return result.TrimEnd();
}
}
然后这是我的视图模型的一部分:
private Rack _rack;
public Rack rack
{
get { return _rack; }
set
{
_rack = value;
createPropertyObserver();
base.RaisePropertyChanged("rack");
}
}
如果在我看来,我将文本框绑定到 rack.rack_no,如果出现验证错误,则工具提示会起作用并显示正确的错误消息。但是,它不会更改文本框以使用验证样式。
如果我创建相同的属性 (rack_no) 并在我的视图模型中实现 idataerrorinfo,然后我绑定到它,它可以完美运行。
我只想知道我是否在这里做错了什么,比如这不是有效的验证绑定吗?有没有办法让我继续绑定到 rack.rack_no 类并使用验证?