使用单个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
更改为我的网格名称或其他任何东西,没有任何事情发生,没有显示错误消息。
那么我应该怎么做才能从多个组件中"捕获"错误呢?
我建议两种不同的方法:
第一种方式: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