通过Window的ViewModel验证UserControl的控件

时间:2017-01-03 15:06:27

标签: c# wpf validation mvvm

假设我已将自定义 LoginForm 创建为UserControl,其中包含TextBoxPasswordBoxTextBox已安装自定义ErrorTemplate。当然,我希望将此LoginForm作为可重用,因此我想将验证逻辑与此LoginForm分开。

问题是,如果我 LoginForm的文本属性绑定到" validation-property" ViewModel:IDataErrorInfo ,设置为Window' s DataContextErrorTemplate未应用于LoginForm' s { {1}}即使我看到来自ViewModel验证器的调试日志。

如何通过独立的ViewModel验证可重用组件的子控件?

2 个答案:

答案 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模式:

  1. UserControl DepdendencyProperty类型IDataErrorInfo中创建,稍后将由 ViewModel 实施(出于我的目的,我使用了 ISignUpValidator < / strong>:带有 UsernameValue 属性的IDataErrorInfo)。 假设此属性以验证器的名称注册(作为我使用的默认值&#34;无所事事&#34;我的界面的实现)。
  2. UserControl的{​​{1}}属性绑定到验证程序属性: 假设TextBox.Text属性在名称下面显示TextBox.Text用户名

    UserControl
  3. 最后 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