卡特尔验证错误未在视图中显示

时间:2019-01-12 10:49:56

标签: wpf validation view viewmodel catel

我对Catel有一个问题,无法在视图中显示字段验证的结果(在视图模型或模型中完成):如果字段中有错误,则相应的文本框应标记为红色框。但是由于某种原因,我无法正常工作。

这是一个非常简化的测试方案,其视图模型具有2个整数字段,并且验证规则要求两个值均<100:

    public class MainViewModel : ViewModelBase
    {
        public MainViewModel() : base()
        { }

        protected override async Task InitializeAsync()
        {
            await base.InitializeAsync();
        }

        protected override async Task CloseAsync()
        {
            await base.CloseAsync();
        }

        public override string Title { get { return "Test"; } }


        public int Value1
        {
            get { return GetValue<int>(Value1Property); }
            set { SetValue(Value1Property, value); }
        }
        public static readonly PropertyData Value1Property = RegisterProperty(nameof(Value1), typeof(int), 42 );

        public int Value2
        {
            get { return GetValue<int>(Value2Property); }
            set { SetValue(Value2Property, value); }
        }
        public static readonly PropertyData Value2Property = RegisterProperty(nameof(Value2), typeof(int), 99);


        protected override void ValidateFields(List<IFieldValidationResult> validationResults)
        {
            if (Value1 >= 100)
            {
                validationResults.Add(FieldValidationResult.CreateError(Value1Property, "Value1 must be < 100" ));
            }

            if (Value2 >= 100)
            {
                validationResults.Add(FieldValidationResult.CreateError(Value1Property, "Value2 must be < 100"));
            }
        }

        protected override void ValidateBusinessRules(List<IBusinessRuleValidationResult> validationResults)
        {  }
    }
}

请注意:在我的真实项目中,字段和验证将在模型中,但是出于测试的原因,我将其简化为一个视图和一个视图模型。

这个简单的视图将viewmodel作为数据上下文:

<catel:Window x:Class="WPF_Catel_Validation.Views.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
              xmlns:catel="http://schemas.catelproject.com">

    <StackPanel Orientation="Vertical" HorizontalAlignment="Left">
        <TextBox Text="{Binding Value1, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" Width="100" />
        <TextBox Text="{Binding Value2, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" Width="100" />
    </StackPanel>    
</catel:Window>

视图和视图模型之间的连接有效。当在文本框中输入非数字文本时,该视图还显示错误。带有方法ValidateFields()的viewmodel也可以识别任何错误,但是该视图不会在文本框周围用红色框显示这些验证错误。

我已经使用Catel 5.8.0和.NET 4.7.2进行了测试。我有点怀疑Catel类的ViewModelBase如何实现INotifyDataErrorInfo,但是在该类中看不到ErrorsChanged事件。但是总的来说,我不知道我的视图模型,视图或Catel或其他问题是否存在问题?我也没有在Catel上找到任何最新文档。任何建议都将受到高度赞赏-谢谢!

1 个答案:

答案 0 :(得分:0)

如果想立即显示它们,可能需要将 DeferValidationUntilFirstSave 设置为false。

相关问题