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都绑定到 TextBoxProperty1TextBoxProperty2TextBoxProperty3TextBoxProperty4。我真正想要的是,如果值的总和不是 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应该OneWayStackPanel上,因为您无法真正修改源代码。

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>