【问题标题】:Validation for empty text box验证空文本框
【发布时间】:2012-07-30 11:46:32
【问题描述】:

我的 wpf 应用程序上有三个文本框。当用户在这些文本框中输入值并单击Add 时,这些值将添加到列表中并显示在数据网格中。

文本框本身并没有绑定到任何东西,我将这些文本框值添加到绑定到数据网格的观察集合中。我想防止用户在文本框中输入空值。这是怎么做到的?

我看到了一些示例,但这些示例都将文本框绑定到值,然后使用 Binding.Validation。在我的情况下,当绑定到文本框时,这将如何完成?

我还有一个在输入空值时必须冻结的按钮。为此,我通过创建一个类并以下列方式绑定该类来实现以下方法;

<Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="IsEnabled" Value="false" />
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=textBox1, Path=(Validation.HasError)}" Value="false" />
                                <Condition Binding="{Binding ElementName=textBox2, Path=(Validation.HasError)}" Value="false" />
                                <Condition Binding="{Binding ElementName=TextBoxAge, Path=(Validation.HasError)}" Value="false" />                                
                            </MultiDataTrigger.Conditions>
                            <Setter Property="IsEnabled" Value="true" />
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>

.cs 类

 public class TextBoxNotEmptyValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string str = value as string;
            if (str != null)
            {
                if (str.Length > 0)
                    return ValidationResult.ValidResult;
            }
            return new ValidationResult(false, Message);
        }
        public string Message { get; set; }
    }

【问题讨论】:

  • 为什么不将文本框绑定到值,就像您看到的示例一样?这将鼓励您编写结构更好的代码,这将使您长期受益。
  • @DanPuzey:你能解释一下这种绑定是如何发生的以及这些值将如何添加到可观察集合中吗?我有点不明白这个概念;-/

标签: c# wpf validation multidatatrigger


【解决方案1】:

如果我没听错的话,您正在寻找这样的东西:

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Setter Property="IsEnabled" Value="True" />
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Text, ElementName=textBox1}" Value="{x:Static s:String.Empty}" />
                    <Condition Binding="{Binding Text, ElementName=textBox2}" Value="{x:Static s:String.Empty}" />
                    <Condition Binding="{Binding Text, ElementName=TextBoxAge}" Value="{x:Static s:String.Empty}" />
                </MultiDataTrigger.Conditions>
                <Setter Property="IsEnabled" Value="False" />
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

添加这个命名空间

xmlns:s="clr-namespace:System;assembly=mscorlib"

更新

那么这将起作用:

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Resources>
            <local:MyTextValidationConverter x:Key="MyTextValidationConverter" />
        </Style.Resources>
        <Setter Property="IsEnabled">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource MyTextValidationConverter}">
                    <Binding Path="Text" ElementName="textBox1" />
                    <Binding Path="Text" ElementName="textBox2" />
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</Button.Style>

还有这个转换器代码

public class MyTextValidationConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string text1 = values[0] as string;
        if (string.IsNullOrEmpty(text1)) return false;

        string text2 = values[1] as string;
        if (string.IsNullOrEmpty(text2)) return false;

        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • 看起来像填充文本框之一启用按钮。我想对其中两个文本框强制执行非空验证。
  • 指定你想要的。哪两个文本框?如果两个都非空或只有一个,您是否希望启用 Button?
  • textBox1textBox2 不应接受空输入。在启用按钮之前,两者都应由用户填写。第三个文本框可以为空
  • 很遗憾,因为没有“Or”-MultiDataTrigger 或对 NotEmpty 的任何检查。我已经使用 MultiBinding 解决方案编辑了我的答案。
  • 这应该比使用代码来执行这些任务更好? WPF 让我大吃一惊……你已经用大约 40 行废话替换了一个 if 语句。
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2021-09-30
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多