2017-01-03 4 views
1

Предположим, я создал пользовательский LoginForm как UserControl, который состоит из TextBox и PasswordBox. TextBox установил пользовательский ErrorTemplate. Естественно, я хотел бы иметь этот LoginForm как reusable как можно, поэтому я хочу отделить логику проверки от этого LoginForm.валидирующего UserControl путем окна ViewModel

Проблема заключается в том, что если я связать LoginForm в текстовое свойство к «проверке-собственности» ViewModel: IDataErrorInfo, который устанавливается как Window «s DataContext, то ErrorTemplate не применяется к LoginForm-х TextBox даже если я вижу отладочные журналы из валидатора ViewModel.

Как я могу проверить дочерние элементы управления повторно используемым компонентом через независимый ViewModel?

ответ

0

После нескольких часов изо всех сил, как решить эту проблему, я придумал следующее решение, которое удовлетворяет моим требованиям и поэтому MVVM шаблон:

  1. Создать в UserControl a DepdendencyProperty типа IDataErrorInfo, который будет затем реализован вашим ViewModel (для моих целей я использовал ISignUpValidator: IDataErrorInfo с Пользовательское свойство). Допустим, что это свойство зарегистрировано под именем Validator (в качестве значения по умолчанию я использовал реализацию do-nothing моего интерфейса).
  2. Bind UserControl «s TextBox.Text свойство Validator свойство: Позволяет сказать TextBox.Text собственность подвергается UserControl под названием Имя пользователя:

    Username="{Binding Path=Validator.UsernameValue, ElementName=UserControlName, 
                   UpdateSourceTrigger=PropertyChanged, 
                   ValidatesOnDataErrors=True}" 
    
  3. Наконец Bind ваш ViewModel в ваш UserControlВалидатор свойство

    <Window.Resources> 
        <local:ViewModel x:Key="ViewModel"/> 
    <Window.Resources> 
    
    <local:LoginForm Validator={StaticResource ViewModel}> 
    

    Или же, если ваш ViewModel уже установлен как Window «s DataContext:

    <local:LoginForm Validator="{Binding DataContext, ElementName=WindowName}"}> 
    
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> 
+0

Привет, у меня есть уже один пользовательский ErrorTemplate, который работает на текстовом поле, если я выполнить проверка на уровне управления. Моя проблема в том, что я хотел бы переместить проверку на более высокий уровень. Кажется, что дочерний элемент usercontrol не знает об ошибке своего родителя. Я ищу какое-то решение, как это сделать. – matoni

Смежные вопросы