StackPanel的ErrorTemplate

时间:2014-04-03 15:19:54

标签: c# .net wpf

目前,我的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绑定到TextBoxProperty1TextBoxProperty2,{{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,因为您无法真正修改来源。

1 个答案:

答案 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>