【问题标题】:WPF TextBox setting red border on ValidationWPF TextBox在验证上设置红色边框
【发布时间】:2016-05-11 17:36:08
【问题描述】:

我试图在文本框为空时将其设为红色。这是我的 xaml:

     <TextBox  Style="{StaticResource TextBoxEmptyError}" Name="tbFilename" Grid.Column="1" >
         <Binding Path="Text" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
            <Binding.ValidationRules>
                <local:EmptyRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox>

我正在尝试设置的样式:

        <Style x:Key="TextBoxEmptyError" TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="BorderThickness" Value="2" />
                    <Setter Property="BorderBrush" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>

空规则:

public class EmptyRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (string.IsNullOrEmpty(value as string))
                return new ValidationResult(false, null);
            else
                return new ValidationResult(true, null);

        }
    }

在调试器中看起来根本没有使用验证方法。 我做错了什么?

【问题讨论】:

    标签: c# wpf validation


    【解决方案1】:

    我看不到您在 XAML 和 viewModel 之间设置 DataContext 的位置。

    DataContext 是一种了解 XAML(查看,您的 Window)可以从哪里获取数据的方法。

    例如,你有模型类:

    internal class SomeUser
    {        
        private string _name;
        private string _address;
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
            }
        }
    
        public string Address
        {
            get { return _address; }
            set { _address = value; }
        }
    }
    

    那么您应该将DataContext 设置为您的Window。例如,在代码隐藏中:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new SomeUser();       
        }
    }
    

    那么 XAML 应该如下所示:

    <Grid>
      <Grid.Resources> 
         <Style x:Key="CustomTextBoxTextStyle" TargetType="TextBox">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TextBox}">
                            <Border x:Name="bg" BorderBrush="#FF825E5E" BorderThickness="1">
                                <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                            <ControlTemplate.Triggers>
    
                                <Trigger Property="Validation.HasError" Value="True">
                                    <Trigger.Setters>
                                        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>                                        
                                        <Setter Property="BorderThickness" TargetName="bg" Value="2"/>
                                        <Setter Property="BorderBrush" TargetName="bg" Value="Red"/>
                                    </Trigger.Setters>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Grid.Resources>
    </Grid>
    
    <TextBox Style="{StaticResource CustomTextBoxTextStyle}" Height="23" Name="textBox1" Margin="25">
                <Validation.ErrorTemplate>
                    <ControlTemplate>
                        <DockPanel>
                            <TextBlock Foreground="Red" DockPanel.Dock="Right">!</TextBlock>
                            <AdornedElementPlaceholder x:Name="ErrorAdorner"
        ></AdornedElementPlaceholder>
                        </DockPanel>
                    </ControlTemplate>
                </Validation.ErrorTemplate>
    
                <TextBox.Text>
                    <Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <local:NameValidator></local:NameValidator>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
    </TextBox>
    

    【讨论】:

      【解决方案2】:

      你的BindingText 应该是这样的......

      <Binding Path="Text" UpdateSourceTrigger="LostFocus" Mode="OneWayToSource" NotifyOnValidationError="True" RelativeSource="{RelativeSource Self}">
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2017-02-14
        相关资源
        最近更新 更多