我的想法是,我想在窗口底部显示一个错误,但错误的来源可能是几个元素,如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>
和一个用于显示错误的TextBox
Text="{Binding ElementName=myElement,
Path=(Validation.Errors).CurrentItem,
Converter={StaticResource ErrorConverter}
我拥有所有必需的DependencyProperties
。问题是,错误文本框一次只能绑定到一个组件(在我的示例中为myElement
),如果我将ElementName
更改为我的网格名称或其他任何内容,没有任何反应,没有错误消息显示。
那么我应该怎样做才能“捕获”来自多个组件的错误?
答案 0 :(得分:1)
我建议采用两种不同的方法:
第一种方式: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方
或者,您只需使用MultiBinding
,或只使用包含TextBlock
个Run
对象的 <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
每个元素只需添加一个{{1}}