【问题标题】:Run WPF Validation only if control is Visible (Disable validation if control is Collapsed)仅当控件可见时运行 WPF 验证(如果控件折叠则禁用验证)
【发布时间】:2021-01-15 12:49:06
【问题描述】:

我想让 WPF 验证仅在正在验证的控件可见时运行。
在我的项目中,根据用户的选择,一些控件被折叠

我有一个仅在没有验证错误时才启用的按钮(我使用 WPF 多值转换器并检查所有控件是否有效 - HasError 对于所有控件都是错误的)。

验证是使用 ValidationRules 实现的。

因此,我的目标是验证所有当前可见的控件(仅可见!),而不是因为折叠字段为空而禁用 Button...
有没有办法仅在控件可见且输入无效时才引发验证错误

我在互联网上搜索了几天,但我没有找到针对这种情况的任何解决方案...

提前致谢!最好的问候!

【问题讨论】:

  • 如何添加验证规则?来自 xaml?
  • @Lana 是的,我从 XAML 添加验证规则。

标签: c# wpf validation data-binding validationrules


【解决方案1】:

如果您使用 xaml 来设置您的规则,下面的代码可以满足您的需求。可见性触发器,无绑定 - 无验证)我仅使用 TextBox 作为示例。 您也可以使用其他方法,将显示元素已隐藏的属性传递给您的 ValidationRule,并在规则How to bind values from xaml to validation rule?

中检查它
<TextBox Visibility="{Binding IsVisible, Converter={wpfApp1:BoolToVisibilityConverter}}">
        <TextBox.Text>
            <Binding Path="Text" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <wpfApp1:TextValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="Visibility" Value="Collapsed">
                        <Setter Property="Text" Value="{x:Null}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

【讨论】:

  • 非常感谢您的回答!我已经尝试过这种方法,但是控件仍然将Validation.HasError 设置为True,即使它已折叠,所以我的按钮仍然被禁用。你知道我怎么能影响这个吗?我认为像您一样删除验证会将Validation.HasError 重置为False,但不幸的是,事实并非如此......
【解决方案2】:

您可以将属性添加到您的验证规则中,例如启用并在验证时使用它(如果未启用则返回成功验证)。 然后将该属性在 XAML 中绑定到控件的 Visibility 属性或确定控件是否可见的任何内容(即 CheckBox 的 IsChecked 属性)。 编辑:代码清晰:

<CheckBox Name="chkName" />
<TextBox Visibility="{Binding IsChecked, ElementName=chkName, Convertor...}">
    <TextBox.Text>
        <Binding Path="ModelProperty">
            <Binding.ValidationRules>
                <wpfApp1:TextValidationRule Enabled="{Binding IsChecked, ElementName=chkName}" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

【讨论】:

  • 不能直接绑定属性到ValidationRule
  • @Shadowed 非常感谢您的回答!不幸的是,正如 Lana 所说,您不能直接将属性绑定到 ValidationRule,因为 ValidationRule 不是从 DependencyObject 继承的......这个答案使用了相同的想法,但更详细地说明了如何克服这个问题:stackoverflow.com/questions/46519802/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2011-02-17
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多