我有一个只包含标签和TextBox的usercontrol。我想使用IDataErrorInfo接口验证我的viewmodel中的文本框条目。验证启动,但错误不会显示在我的usercontrol中的TextBox上,而是显示在usercontrol本身上。
这是usercontrol(其他依赖属性在基类中):
<cc:LabelableInputControl>
<Grid x:Name="LayoutRoot" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding Path=LabelText, FallbackValue=Empty Label}"
Grid.Column="0"
HorizontalAlignment="Left"
Name="BaseLabel"
VerticalAlignment="Center"
Width="{Binding Path=LabelWidth}"/>
<TextBox Grid.Column="1"
x:Name="BaseTextBox"
Text="{Binding Text" />
</Grid>
</cc:LabelableInputControl>
这是背后的代码:
public partial class LabelableTextBox : LabelableInputControl
{
[Bindable(true)]
public string Text
{
get { return (string)GetValue(TextProperty); }
set
{
SetValue(TextProperty, value);
}
}
public static readonly DependencyProperty TextProperty = TextBox.TextProperty.AddOwner(typeof(LabelableTextBox));
public LabelableTextBox()
{
InitializeComponent();
LayoutRoot.DataContext = this;
}
}
这就是(假设)使用的方式:
<cc:LabelableTextBox LabelText="{x:Static text:Resources.Label_Username}"
Text="{Binding Username, Mode=TwoWay,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />
我的问题是:如何将验证错误“转发”到TextBox?目前,验证错误显示如下,但我不希望整个用户控件被框起来。
谢谢!
答案 0 :(得分:1)
看一下这个主题:Validation Error Templates For UserControl
他们使用ErrorTemplates和触发器来解决它。
答案 1 :(得分:0)
感谢dotvens链接线程,我能够解决我的问题,但有点不同。
我为usercontrol设置了一个全局样式,以禁用默认的Validation.ErrorTemplate
<Style TargetType="{x:Type cc:LabelableTextBox}">
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
</Style>
我在我的usercontrols代码隐藏中实现了IDataErrorInfo
接口:
public partial class LabelableTextBox : LabelableInputControl, IDataErrorInfo
{
[Bindable(true)]
public string Text
{
get { return (string)GetValue(TextProperty); }
set
{
SetValue(TextProperty, value);
}
}
public static readonly DependencyProperty TextProperty = TextBox.TextProperty.AddOwner(typeof(LabelableTextBox));
public LabelableTextBox()
{
InitializeComponent();
LayoutRoot.DataContext = this;
}
}
public string Error
{
get { throw new System.NotImplementedException(); }
}
public string this[string columnName]
{
get
{
string result = null;
var errors = Validation.GetErrors(this);
if (errors.Count > 0)
{
result = errors[0].ErrorContent.ToString();
}
return result;
}
}
最后,在我的用户控件内的ValidatesOnDataErrors
上设置TextBox
为true
。
多数民众赞成!简单,它的工作。如果有人看到一些缺点,请告诉我。