Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的ValidationRule与行为_C#_Wpf_Xaml_Behavior_Validationrule - Fatal编程技术网

C# WPF中的ValidationRule与行为

C# WPF中的ValidationRule与行为,c#,wpf,xaml,behavior,validationrule,C#,Wpf,Xaml,Behavior,Validationrule,假设我正在尝试实现一项功能,其中文本框只允许用户输入整数。我可以通过两种方式实现这一点,使用ValidationRule检查用户输入的任何内容并通过XAML将其绑定到文本属性,或者我可以创建一个新行为并将其附加到控件(而不是通过绑定) 这两个平台上的XAML示例: 行为: 绑定到窗口文本属性的ValidationRule <TextBox> <TextBox.Text> <Binding RelativeSource = "{Relativ

假设我正在尝试实现一项功能,其中文本框只允许用户输入整数。我可以通过两种方式实现这一点,使用ValidationRule检查用户输入的任何内容并通过XAML将其绑定到文本属性,或者我可以创建一个新行为并将其附加到控件(而不是通过绑定)

这两个平台上的XAML示例:

行为:

绑定到窗口文本属性的ValidationRule

<TextBox>
    <TextBox.Text>
        <Binding RelativeSource = "{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
            <Binding.ValidationRules>
                <utils:RestrictInputTypeValidator Restriction="IntegersOnly" ValidatesOnTargetUpdated="True"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>


这些方法的优点和缺点是什么?我应该什么时候使用它们?或者这是一个偏好的问题?

对于我喜欢的行为,我期望没有错误的“积极”场景/工作流程。重点是没有错误。用户很快就会发现,当他们在文本框中键入一个带有数字行为的“
a
”时,它不会接受它,它是一个数字文本框,这就是它的工作方式

通过验证,重点似乎更多地放在错误上。我可以有一个数字文本框,但我也不接受超过100的数字,如果您键入“
101
”,我会告诉您这是不可接受的。这里的重点是通过抛出验证错误来引导用户进入不可接受的领域

行为优势:

  • 通过输入错误数据进行预防(您不会让用户射中自己的脚)
  • 模型保持干净。TextBox的绑定甚至不会命中setter,因为行为会阻止它,因此不会使用PropertChanges或ValidationErrors等触发XAML
行为缺陷:


-可能会令人困惑,因此如果您将逻辑设置为不接受“101”,则没有默认的方法来指导用户

我不确定这两种行为优势是否都列出了。据我所知,使用验证规则,您还可以通过“不点击setter”来防止输入坏数据并保持模型干净。我已经多次使用验证规则,它具有我所需要的所有功能。我看到的唯一缺点是:如何在ViewModel中知道所有字段是否有效?您可以使用Validation.Error=“onfielvalidationerror”(但这是一个自定义解决方案)解决此问题。如果验证失败,则不会更新属性。因此,即使使用ValidationRules,模型仍然是干净的。好吧,除了将填充的验证错误,如果您对其进行查询/触发,那么模型是不干净的……为什么不继续呢?