WPF программно настраивает поля по мере необходимости - PullRequest
2 голосов
/ 06 октября 2011

Я довольно новичок в WPF, но потратил время на изучение валидации WPF и пока не видел хорошего подхода к условной валидации.

Чтобы значительно упростить ситуацию, скажем, у меня есть два текстовых поля и отправкакнопка.Пользователь вводит строку в первое текстовое поле.Если пользователь вводит, например, «ABC», то второе текстовое поле должно быть обязательным полем (я бы хотел, чтобы фон был светло-голубого цвета, чтобы обозначить это), и кнопка отправки должна быть отключена, пока это текстовое поле не будетНаселение.

Как это можно сделать?Есть ли простой способ добавить / удалить проверки во время выполнения?«DataAnnotations» (http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx) показалось хорошей отправной точкой, однако я не могу пометить поле атрибутом [Required], так как это поле не всегда будет обязательным. По сути, мне нужно что-то вроде «Required, если Field1 =»'ABC'

Спасибо!

Ответы [ 2 ]

7 голосов
/ 06 октября 2011

Я бы справился с этим, используя MVVM, и вот пример для этого.Реализуйте IDataError Info для класса, и это будет реализовывать два свойства Error, и это [string columnName] вы можете реализовать второе свойство с вашими ошибками привязки, которые вы хотите

public class MainViewModel:ViewModelBase,IDataErrorInfo  
{

 public string Error
  {
  }
public string this[string columnName]

{
 get
  {
     string msg=nulll;
     switch(columnName)
        {
          case "MyProperty": //that will be your binding property
           //choose your validation logic
           if(MyProperty==0||MyProperty==null)
             msg="My Property is required";
            break;
         }
     return msg;
    }
}

Также установите ValidateOnErrors = True в привязкетекстовое окно.здесь ColumnName - это имя свойства, которое было изменено и для которого ValidateOnErrors установлено значение true.Проверьте здесь, поставьте условия и верните сообщение, после чего вы увидите ошибки во всплывающей подсказке, когда добавите этот стиль в свои ресурсы.

<UserControl.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true" >
                <Setter Property="Foreground" Value="Red"/>
                <Setter Property="Background" Value="MistyRose"/>
                <Setter Property="BorderBrush" Value="Red"/>
                <Setter Property="BorderThickness" Value="1.0"/>
                <Setter Property="VerticalContentAlignment" Value="Center"/>
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

, а вот пример текстового поля

<TextBox Text="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
 Path=PropertyName,ValidatesOnDataErrors=True}" Name="textBox1">
  <Validation.ErrorTemplate>
        <ControlTemplate>
          </ControlTemplate>
   </Validation.ErrorTemplate>

 </TextBox>
1 голос
/ 06 октября 2011

Я бы просто обработал эту логику в вашей ViewModel (при условии, что вы используете шаблон MVVM, если не просто в своем коде).

Запустите некоторую логику для события TextChanged для первого текстового поля, котороев конечном итоге устанавливает соответствующие свойства.По сути я говорю код этой проверки вручную.Как только вы начнете понимать более сложную логику валидации, вы начнете сталкиваться с ограничениями рамок валидации / декларативной валидации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...