在ViewModel中进行所有验证

本文关键字:验证 ViewModel | 更新日期: 2023-09-27 18:00:14

我如何停止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;}

当用户选择文本框中的所有文本并将其删除(或在"asdf"中键入)时,转换失败,它将获得红色边框,验证将停止。我已尝试使用ValidatesOn。。。属性(我认为这将允许我的"MyValidationAttribute"执行),但没有成功。我还尝试添加一个ValidationRule,无论Text是什么,它总是返回true,但什么都不起作用。

在ViewModel中进行所有验证

如果将TextBox.Text绑定到DateTime,并且用户在"my hovercraft is full of little lambs"中键入,那么Binding可以为您的视图模型属性分配什么以供验证?它无能为力。

您可以将TextBoxValidation.ErrorTemplate设置为一个空模板,这样就可以消除红色轮廓业务,但在您的viewmodel属性中仍然无法获得任何可验证的内容。

如果您想将用户的字符串输入验证为有效或无效日期,则必须在您手中有原始字符串输入的某个时刻进行验证。

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