目前,我的Business Object看起来像这样:
public class FooBar : IDataErrorInfo
{
public Int32 TextBoxProperty1 { get; set; }
public Int32 TextBoxProperty2 { get; set; }
public Int32 TextBoxProperty3 { get; set; }
public Int32 TextBoxProperty4 { get; set; }
public Int32 Total{ get; set; }
public override Boolean Validate()
{
if (Total < 100)
{
throw new Exception();
}
return true;
}
public string Error
{
get { throw new NotImplementedException(); }
}
public string this[String propertyName]
{
get
{
if (propertyName == "Total")
if (Validate())
return "Error";
return null;
}
}
}
现在我的XAML(位于ResourceDictionary
中)我的DataTemplate包含4个文本框,其中每个TextBox
绑定到TextBoxProperty1
,TextBoxProperty2
,{{1} },TextBoxProperty3
。我真正想要的是,如果值总和不超过100,那么StackPanel周围会显示一个红色边框,其中包含4 TextBoxProperty4
。我的XAMl看起来像这样:
TextBoxes
任何方式我都可以将样式应用到<DataTemplate x:Key="MyTemplate">
<StackPanel Style="{StaticResource errorSPStyle}">
<StackPanel.DataContext>
<Binding Path="Parameter" Mode="TwoWay" ValidatesOnExceptions="True" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged" />
</StackPanel.DataContext>
<pres:TextBox Width="40">
<pres:TextBox.Text>
<Binding Path="Parameter.TextBoxProperty1" Mode="TwoWay" ValidatesOnExceptions="True" NotifyOnValidationError="True">
</Binding>
</pres:TextBox.Text>
</pres:TextBox>
<pres:TextBox Width="40">
<pres:TextBox.Text>
<Binding Path="Parameter.TextBoxProperty2" Mode="TwoWay" ValidatesOnExceptions="True" NotifyOnValidationError="True">
</Binding>
</pres:TextBox.Text>
</pres:TextBox>
<pres:TextBox Width="40">
<pres:TextBox.Text>
<Binding Path="Parameter.TextBoxProperty3" Mode="TwoWay" ValidatesOnExceptions="True" NotifyOnValidationError="True">
</Binding>
</pres:TextBox.Text>
</pres:TextBox>
<pres:TextBox Width="40">
<pres:TextBox.Text>
<Binding Path="Parameter.TextBoxProperty4" Mode="TwoWay" ValidatesOnExceptions="True" NotifyOnValidationError="True">
</Binding>
</pres:TextBox.Text>
</pres:TextBox>
而不是StackPanel
上?我知道TextBox
上的Binding
应为OneWay
,因为您无法真正修改来源。
答案 0 :(得分:0)
我不确定单独使用IDataErrorInfo接口是否可行 - 我认为这主要是为了将各个属性绑定到文本框等控件,并为这些控件提供验证反馈。
一种选择是在你的BO上暴露一个布尔属性(也需要实现INPC),即
public bool IsValid
{
get { return _isValid; }
set
{
if (_isValid != value)
{
_isValid = value;
OnPropertyChanged("IsValid");
}
}
}
您可以在this[]
属性中将此属性值设置为true或false。
在你的xaml中,使用DataTrigger创建一个样式来设置StackPanel周围的边框样式,例如: -
<Style x:Key="BorderStyle" TargetType="Border">
<Setter Property="BorderBrush" Value="White"/>
<Setter Property="BorderThickness" Value="1"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsValid}" Value="False">
<Setter Property="BorderBrush" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Border Style="{StaticResource BorderStyle}">
<StackPanel ..etc..
</Border>