在ViewModel中完成所有验证

时间:2016-08-03 16:31:30

标签: c# wpf validation mvvm

如何停止 UI层执行转换验证,或者至少让它继续?如果我有一个绑定到DateTime的文本框:

// view
<TextBox x:Name="StartTimeTextBox">
        <TextBox.Text>
            <Binding Path="StartTime"
                     StringFormat="t"
                     NotifyOnValidationError="True" 
                     ValidatesOnDataErrors="True" 
                     ValidatesOnExceptions="True" >
                <Binding.ValidationRules>
                    <va:AlwaysSucceedsValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

// view model
[MyValidationAttribute]
public DateTime StartTime {get; set;}

当用户选择文本框中的所有文本文本并删除它(或键入&#34; asdf&#34;)时,转换失败,它会出现红色边框并且验证停止 。我尝试过使用ValidatesOn ...属性(我认为可以让我的&#34; MyValidationAttribute&#34;执行)但没有成功。我还尝试添加一个ValidationRule,无论Text是什么,它总是返回true - 但没有任何效果。

1 个答案:

答案 0 :(得分:1)

如果您将TextBox.Text绑定到DateTime,并且用户输入了"my hovercraft is full of little lambs",那么Binding可能分配给您的viewmodel属性以供您验证?它无能为力。

您可以将Validation.ErrorTemplate的{​​{1}}设置为空模板,这样就可以摆脱红色大纲业务,但您仍然无法在viewmodel属性中获得任何可验证的内容。

如果要将用户的字符串输入验证为有效或无效的日期,则必须在您手中输入原始字符串的某个位置执行此操作。

如果要在viewmodel中执行此操作,则意味着为viewmodel提供TextBox string 属性,并将其绑定到StartTime。称之为TextBox;在其setter中,如果字符串有效,则设置StringStartTime;如果无效,它会单独留下DateTime StartTime但设置一些错误属性,或抛出异常,或者其他什么。