【问题标题】:WPF validation not working as expectedWPF 验证未按预期工作
【发布时间】:2013-01-21 14:16:34
【问题描述】:

我想验证 WPF 上的 TextBox。我正在使用Binding 来验证它:

<TextBox Text="{Binding Path=Name, UpdateSourceTrigger=Explicit}" TabIndex="0" LostFocus="TextBox_OnLostFocus">
</TextBox>

LostFocus 事件:

private void TextBox_OnLostFocus(object sender, RoutedEventArgs e)
{
    ((Control) sender).GetBindingExpression(TextBox.TextProperty);
}

验证背后的代码:

public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        this.OnPropertyChanged(new PropertyChangedEventArgs("Name"));

    }
}

public string Error { get { return this[null]; } }

public string this[string columnName]
{
    get
    {
        string result = string.Empty;
        columnName = columnName ?? string.Empty;
        if (columnName == string.Empty || columnName == "Name")
        {
            if (string.IsNullOrEmpty(this.Name))
            {
                result += Properties.Resources.ValidationName + Environment.NewLine;
            }
        }
        return result.TrimEnd();
    }
}

我有一些问题:

1.当我第一次加载我的窗口时,我的控件被一个红色方块(验证方块)包围,但我希望它仅在我触发它时出现(在Explicit边)。

2. 我如何知道我的所有字段是否都已通过验证?我的意思是,当我按下按钮时,我只需要知道如何知道所有控件是否都已被验证

注意:我在构造函数上有这个上下文:

User u = new User();
DataContext = u;

【问题讨论】:

    标签: c# wpf validation textbox wpf-controls


    【解决方案1】:
    1. 您的第一个问题可能会得到解答here您是否尝试将绑定模式设置为默认?
    2. Validation.HasError 附加属性将告诉您特定 UI 元素上的任何绑定是否存在任何绑定验证错误。在您需要验证的每个控件上使用它。先试试那个。如果您使用像 MVVM 这样的模式,您可以在 VM 上创建属性以绑定到 Validation.HasError 属性。

    【讨论】:

    • Validation.HasError 确实解决了第二个问题,但第一个问题仍然存在。当我加载我的文本框时,它仍然是红色的......
    • 可能是因为您的属性已经无效。我认为这样做是一种很好的做法。为什么打开窗口时空文件名可以,但添加一个字符然后删除后就不行了?
    • 我同意你,@dowhilefor,但部分同意。在第一次加载时,我不认为它是红色的那么实用,因为它并不明显,因为用户还没有写任何东西。所以我不确定如何避免这种情况(仅适用于视觉实践)。另一方面,我也误解了大小。我将模式更改为默认,但它仍然是红色。
    【解决方案2】:

    实际上,我的问题与我用来验证的类有关。班级这样做:

    public ErrorProvider()
    {
        this.DataContextChanged += new DependencyPropertyChangedEventHandler(ErrorProvider_DataContextChanged);
        this.Loaded += new RoutedEventHandler(ErrorProvider_Loaded);
    }
    

    所以每当它第一次加载时,它都会订阅Load 事件,然后它会启动这个:

    private void ErrorProvider_Loaded(object sender, RoutedEventArgs e)
    {
        Validate();
    }
    

    所以我评论了它,并在需要时启动了Validate() 方法....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多