从代码访问 WPF 控件验证规则

2024-05-22

XAML:



  <TextBox Name="textboxMin">
      <TextBox.Text>
          <Binding Path="Max">
              <Binding.ValidationRules>
                  <local:IntValidator/>
              </Binding.ValidationRules>
          </Binding>
      </TextBox.Text>
  </TextBox>
  

Code:



void buttonOK_Click(object sender, RoutedEventArgs e)
{
    // I need to know here whether textboxMin validation is OK
    // textboxMin. ???

    // I need to write something like:
    // if ( textboxMin.Validation.HasErrors )
    //     return;
}
  

如果至少有一个对话框控件未通过验证(在 XAML 中使用绑定),了解如何禁用“确定”按钮也将是件好事。通过这种方式,我不需要检查代码中的验证状态。


Validation.HasError 是一个附加属性,因此您可以像这样检查 textboxMin

void buttonOK_Click(object sender, RoutedEventArgs e)
{
    if (Validation.GetHasError(textboxMin) == true)
         return;
}

要在代码中运行 TextProperty 的所有 ValidationRules,您可以获取 BindingExpression 并调用 UpdateSource

BindingExpression be = textboxMin.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();

Update

如果发生任何验证,将需要一些步骤来实现绑定以禁用按钮。

首先,确保所有绑定都添加 NotifyOnValidationError="True"。例子

<TextBox Name="textboxMin">
    <TextBox.Text>
        <Binding Path="Max" NotifyOnValidationError="True">
            <Binding.ValidationRules>
                <local:IntValidator/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

然后我们将 EventHandler 连接到窗口中的 Validation.Error 事件。

<Window ...
        Validation.Error="Window_Error">

在后面的代码中,我们在可观察集合中添加和删除验证错误,因为它们来来去去

public ObservableCollection<ValidationError> ValidationErrors { get; private set; } 
private void Window_Error(object sender, ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
    {
        ValidationErrors.Add(e.Error);
    }
    else
    {
        ValidationErrors.Remove(e.Error);
    }
}

然后我们可以像这样将 Button 的 IsEnabled 绑定到 ValidationErrors.Count

<Button ...>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ValidationErrors.Count}" Value="0">
                    <Setter Property="IsEnabled" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从代码访问 WPF 控件验证规则 的相关文章

  • WPF 中 ToggleButton 的 IsChecked 属性的 OneWay 绑定

    我有一个ToggleButton以其IsChecked使用 OneWay 绑定将属性绑定到属性
  • 如何在不监听框架控件中定义的任何鼠标事件的情况下检测鼠标单击?

    是否可以在不侦听框架控件中定义的任何鼠标事件的情况下检测鼠标单击 我的意思是 我不想编写如下代码 control MouseLeftButtonDown this HandleMouseLeftButtonDown 但我想知道用户是否点击屏
  • React-hook-form 文本字段的条件验证,基于是否选中另一个复选框?

    我正在尝试向文本字段添加验证规则 如果选中表单中的单独复选框 则该字段必须是非空字符串才能提交表单 这是我到目前为止所拥有的内容的链接 https codesandbox io s magical hypatia n7o5w https c
  • 拖动用户控件,但将其保留在 WPF 中其父级的边界内

    我有一个用户控件 正在将其拖动到网格内 Z Index 设置得相当高 这样我就可以将其保持在其他孩子之上 拖动控件效果很好 但如果用户想要将控件移到网格之外 它会允许这样做 How do I keep it from leaving the
  • Rails 验证日期范围的唯一性

    我有一个涉及员工缺勤记录的应用程序 我需要确保每条记录的开始日期和结束日期不重叠 例如 如果我输入了从今天开始到明天结束的缺勤记录 则不可能以任何方式在该日期范围内输入另一个缺勤记录 所以我不能制作一个从前天开始 然后在后天或任何更晚的日期
  • 如何在Xamarin.Forms中将多个页面的BindingContext设置为同一个ViewModel?

    我是 Xamarin Forms 新手 我想使用 MVVM 模式和 XAML 创建一个跨平台应用程序 在我的表单项目 pcl 中 我想设置绑定上下文 of my MainPage以及将来的多个页面到同一个 ViewModel 这可能吗 让我
  • 带有 ObservableCollection 和动态过滤器的 Silverlight ListBox

    假设我有这门课 public class MyData public bool IsActive get set public String Data1 get set public String Data2 get set and an
  • 如何使用 SQL 查询在 Access 中的字段上设置验证规则?

    我正在使用 MS Access 2016 Office 365 目前遇到问题 下面是一个演示此问题的示例 这里我创建了一个表 名为节点家庭链接 由两个字段组成 NodeID 和 FamilyID 如下所示 现在 NodeID 是从另一个表
  • 如何将 ObservableCollection 绑定到 AvalonDock DocumentPaneGroup?

    我需要在 AvalonDock 2 0 中加载项目集合作为文档 这些对象继承自一个抽象类 我想根据哪个子类在文档中渲染一个框架 这是我的 XAML
  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • 域驱动设计中输入验证应该放在哪里?

    我想知道我们到底应该在哪里放置输入验证 想象一下 API 调用发送输入以应用用户的空闲时间 在服务层注入验证类并在服务内部调用验证方法是否正确 或者最好将其放在基础设施层甚至领域模型中 我只是想看看在域驱动设计方法中实现 API 输入验证的
  • Codeigniter:重置表单值

    在我看来 我想要做的是在用户成功注册后清除表单字段 这里一切正常 即用户正在注册 成功消息正在向用户显示 除了我想要做的是清除表单字段的值 我正在使用这个 Clear the form validation field data so th
  • 使用 jQuery 检查输入是否为空

    我有一个表单 我希望填写所有字段 如果单击某个字段然后未填写 我想显示红色背景 这是我的代码 apply form input blur function if input text is empty this parents p addC
  • Play Framework 2.3 (Scala) 中的自定义 JSON 验证约束

    我设法使用自定义约束实现表单验证 但现在我想对 JSON 数据执行相同的操作 如何将自定义验证规则应用于 JSON 解析器 示例 客户端的 POST 请求包含用户名 username 我不仅要确保该参数是非空文本 而且还要确保该用户确实存在
  • 网格内的 ContentPresenter 可见性绑定不起作用?

    我有以下网格
  • 多语言标记验证器

    是否有免费的在线多语言标记验证服务可以正确识别和验证多语言标记 我确实找到了totalvalidator和htmlvalidator 但这些是 付费 非基于网络的解决方案 Use http validator w3 org nu http
  • 使 DataTemplate 可混合

    如何为 ViewModel 制作可混合的数据模板 可在表达式混合中设计 当我转到资源并尝试直接编辑数据模板时 我在绘图板上看到的只是一个空白矩形 这是因为 DataTemplate 没有绑定到任何东西 当然 我可以创建一个 UserCont
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • VisualStateManager 和生成的转换

    正当我以为我明白的时候VisualStateManager 有些事情证明我错了 我正在使用 WPF 4 并且尝试简单地在鼠标悬停时放大某个项目 并在鼠标离开时将其缩小 我想我只需定义每个状态VisualStateGroup然后指定一个Vis

随机推荐