使用单个TextBlock显示错误消息

本文关键字:错误 消息 显示 TextBlock 单个 | 更新日期: 2023-09-27 18:03:23

这个想法是,我想在窗口底部显示一个错误,但是错误的来源可能是几个元素,如TextBoxes。

我已经成功地创建了单个字段的验证,但是我很难实现我的新目标。

基于互联网教程,我创建了ValidationRule,它只检查输入的文本是否为空。然后添加ErrorConverter:IValueConverter,将错误转换为字符串。在XAML部分,我有一个绑定到2个TextBoxes的验证规则

<TextBox.Text>
    <Binding ElementName="Self" Path="MyProperty" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
        <Binding.ValidationRules>
            <local:ValidateEmpty />
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

和一个文本框显示错误

Text="{Binding ElementName=myElement,
      Path=(Validation.Errors).CurrentItem,
      Converter={StaticResource ErrorConverter}

我有所有需要的DependencyProperties。问题是,错误文本框一次只能绑定到一个组件(myElement在我的例子中),如果我将ElementName更改为我的网格名称或其他任何东西,没有任何事情发生,没有显示错误消息。

那么我应该怎么做才能从多个组件中"捕获"错误呢?

使用单个TextBlock显示错误消息

我建议两种不同的方法:

第一种方式:viewmodel侧验证

如果你的ViewModel实现了IDataErrorInfo来定义输入中的错误,那么你的类中必须有一个string Error。这个字符串实际上是你想要做的事情:对多个错误有一个证明。

这是我实现它的方法:

    public string Error
    {
        get { return PerformValidation(string.Empty); }
    }
    public virtual string this[string propertyName]
    {
        get
        {
            return PerformValidation(propertyName);
        }
    }

我的PerformValidation方法是虚拟的,将在继承类中被重写。但是它看起来是这样的:

    protected override void PerformValidation(string propertyName = null)
    {
        if (string.IsNullOrEmpty(propertyName) || propertyName == "Property1")
        { }
        else if (string.IsNullOrEmpty(propertyName) || propertyName == "Property2")
        { }
        //...
    }

然后,我的TextBlock被简单地绑定到Error字符串,它总是显示第一次遇到的错误

第二种方式:UI-ValidationRule side

或者,您可以简单地使用MultiBinding,或者简单地使用包含Run对象的TextBlock。简单的例子:

        <TextBlock TextAlignment="Center">
             <Run Text="{Binding ElementName=myElement,
                         Path=(Validation.Errors).CurrentItem,
                         Converter={StaticResource ErrorConverter}}" />
             <Run Text="{Binding ElementName=myElement2,
                         Path=(Validation.Errors).CurrentItem,
                         Converter={StaticResource ErrorConverter}}" />
             <Run Text="{Binding ElementName=myElement3,
                         Path=(Validation.Errors).CurrentItem,
                         Converter={StaticResource ErrorConverter}}" />
        </TextBlock>

为每个元素添加一个Run