StackPanel 的错误模板
本文关键字:错误 StackPanel | 更新日期: 2023-09-27 17:56:40
目前,我的业务对象如下所示:
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
中)中,我的数据模板包含 4 个文本框,每个文本框TextBox
都绑定到 TextBoxProperty1
、TextBoxProperty2
、TextBoxProperty3
、TextBoxProperty4
。我真正想要的是,如果值的总和不是 100,则在 StackPanel 周围显示一个红色边框,其中包含 4 个TextBoxes
.我的 XAMl 将如下所示:
<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
在StackPanel
上,因为您无法真正修改源代码。
我不确定仅使用 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>