所以就像这样,我有一个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并直接在我的viewmodel中拥有属性,那么它可以工作,它会显示工具提示和红色验证框。
如果我在一个属于我的viewmodel属性的类中实现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();
}
}
然后这是我的viewmodel的一部分:
private Rack _rack;
public Rack rack
{
get { return _rack; }
set
{
_rack = value;
createPropertyObserver();
base.RaisePropertyChanged("rack");
}
}
如果在我看来,我将文本框绑定到rack.rack_no,如果存在验证错误,工具提示将起作用并显示正确的错误消息。但是,它不会更改文本框以使用验证方式。
如果我在我的viewmodel中创建了相同的属性(rack_no)并实现了idataerrorinfo,那么我将绑定到它,它完美无缺。
我只是想知道我在这里做错了什么,就像这不是一个有效的验证绑定?有没有办法让我继续绑定到rack.rack_no类并使用验证?
答案 0 :(得分:0)
废弃了这个想法,而是决定使用下面给出的方法: http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundation 和 http://www.codeproject.com/Articles/97564/Attributes-based-Validation-in-a-WPF-MVVM-Applicat
这将idataerrorinfo与System.ComponentModel.DataAnnotations结合使用;执行验证。我还更改了我的验证样式以手动创建红色框,这似乎解决了使用默认验证样式的问题,同时验证绑定到子对象的数据绑定。