Почему не удается отобразить ошибку проверки в validationSummary? - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть форма с некоторыми проверками, установленными в классе метаданных сущности.и затем привязка экземпляра объекта к пользовательскому интерфейсу с помощью VM.Примерно так:

Xaml вроде:

   <Grid x:Name="LayoutRoot">
            <StackPanel VerticalAlignment="Top">
                <input:ValidationSummary />
            </StackPanel>
      <TextBox Text="{Binding Name, Mode=TwoWay}" />
      <ComboBox x:Name="xTest" ItemsSource="{Binding MyList}"
               SelectedItem="{Binding MyItem,Mode=TwoWay,
               DisplayMemberPath="MyName"
               ValidatesOnDataErrors=True,
               ValidatesOnNotifyDataErrors=True,
               ValidatesOnExceptions=True,
               NotifyOnValidationError=True,UpdateSourceTrigger=Explicit}"  />
      </Grid>

Кодовый код вроде:

public MyForm()
{
  InitializeComponent();
  this.xTest.BindingValidationError +=new EventHandler<ValidationErrorEventArgs>((s,e)=>{

  BindingExpression be = this.xTest.GetBindingExpression(ComboBox.SelectedItemProperty);
  be.UpdateSource();

  if (e.Action == ValidationErrorEventAction.Added)
    ((ComboBox)s).Foreground = new SolidColorBrush(Colors.Red);
  });
}

Метаданные типа:

[Required]
 public string Name { get; set; }

 [RequiredAttribute]
 public int MyItemID { get; set; }

Но когдаЗапустив приложение, я не получил ничего отображения в ValudationSummary.Для CombBox, даже если есть ошибка, похоже, что событие BindingValidationError никогда не запускается.Как это решить?

1 Ответ

2 голосов
/ 04 сентября 2010

Почему вы используете Explicit UpdateSourceTrigger?

Проверка Silverlight происходит внутри структуры привязки, когда привязка обновляет исходный объект.Таким образом, не будет ошибки проверки привязки, потому что вы никогда не скажете привязке обновить исходный объект.Ну, на самом деле вы делаете, но это происходит внутри обработчика события ошибки проверки.Вы написали код с курицей и яйцом.

  • Удалите UpdateSourceTrigger на вашем переплете или установите Default.
  • Удалить явный вызов BindingExpression.UpdateSource.
  • Удалите установку красного цвета переднего плана ComboBox - вы используете NotifyOnValidationError=True, что устраняет необходимость вручную окрашивать элемент управления.
  • Снимите DisplayMemberPath с привязки

Итак, ваш XAML:

<Grid x:Name="LayoutRoot"> 
    <StackPanel VerticalAlignment="Top"> 
         <input:ValidationSummary /> 
         <ComboBox x:Name="xTest" ItemsSource="{Binding MyList}" 
               SelectedItem="{Binding MyItem,
               Mode=TwoWay, 
               ValidatesOnDataErrors=True, 
               ValidatesOnNotifyDataErrors=True, 
               ValidatesOnExceptions=True, 
               NotifyOnValidationError=True}"  /> 
      </StackPanel> 
</Grid> 

И ваш код:

public MyForm()   
{   
  InitializeComponent();   
  // you don't need anything here to have the validations work
}  
...