假设我已将自定义 LoginForm 创建为UserControl
,其中包含TextBox
和PasswordBox
。 TextBox
已安装自定义ErrorTemplate
。当然,我希望将此LoginForm作为可重用,因此我想将验证逻辑与此LoginForm分开。
问题是,如果我将 LoginForm的文本属性绑定到" validation-property" ViewModel:IDataErrorInfo ,设置为Window
' s DataContext
,ErrorTemplate
未应用于LoginForm' s { {1}}即使我看到来自ViewModel验证器的调试日志。
如何通过独立的ViewModel验证可重用组件的子控件?
答案 0 :(得分:0)
在应用程序资源中使用此错误模板:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="0.8">
<AdornedElementPlaceholder Name="adornerPlaceholder"></AdornedElementPlaceholder>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
答案 1 :(得分:0)
经过几个小时的努力解决这个问题后,我提出了以下解决方案,满足了我的要求和MVVM模式:
UserControl
DepdendencyProperty
类型IDataErrorInfo
中创建,稍后将由 ViewModel 实施(出于我的目的,我使用了 ISignUpValidator < / strong>:带有 UsernameValue 属性的IDataErrorInfo)。
假设此属性以验证器的名称注册(作为我使用的默认值&#34;无所事事&#34;我的界面的实现)。将UserControl
的{{1}}属性绑定到验证程序属性:
假设TextBox.Text
属性在名称下面显示TextBox.Text
的用户名强>:
UserControl
最后将 Viewmodel 绑定到您的{{1>} 验证码属性
Username="{Binding Path=Validator.UsernameValue, ElementName=UserControlName,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True}"
或者,如果 ViewModel 已设置为UserControl
&#39; s <Window.Resources>
<local:ViewModel x:Key="ViewModel"/>
<Window.Resources>
<local:LoginForm Validator={StaticResource ViewModel}>
:
Window