2012-05-29 2 views
3

У меня есть шаблон для отображения красной границы и сообщения об ошибке вокруг элементов управления. Он работает (проверен на TextBoxes и ComboBoxes). Но на двух конкретных comboboxes они этого не делают.
Ну давайте посмотрим, что по-другому в VM:WPF: Validation.ErrorTemplate не отображается

  • , поскольку у меня есть общее выполнение проверки в моем базовом классе, не отображается никаких изменений там
  • такой же асинхронно загруженных данных, который хорошо работает с проверкой только с одна панель над

поэтому короче говоря, нет разницы в VM.
Вид полностью такой же, тот же стиль применяется, поэтому короче нет разницы там тоже.

Поэтому я добавил NotifyOnValidationError=True к ValidatesOnDataErrors=True уже там, и подписался на Validation.Error ... И уволил !!! Тем не менее шаблон все еще не отображается. У меня нет идей, пожалуйста, предложите мне все, что нужно проверить!

EDIT: дальнейшие исследования:

Я декомпилированы DataErrorValidationRule и перекомпилировать его как MyDataErrorValidationRule, чтобы соответствовать оригиналу настолько близко, насколько это возможно. Я удалил ValidatesOnDataErrors=True и добавил мой ValidationRule для отладки. Он возвратил new ValidationResult(false, (object)str); с строкой, содержащей правильное сообщение об ошибке дважды - один раз для установки свойства null, и один раз для принудительной проверки всего объекта. Шаблон еще не отображается.

Я также проверил Validation.GetErrorTemplate на контроле (во время первого обжига Validation.Error), и это было NOT NULL, так что это не DynamicResource, что не удалось ни.

EDIT: рабочий пример:

<ItemsControl ItemsSource="{Binding QuestionAnswers}"> 
       <ItemsControl.Resources> 
        <!-- ... --> 
        <DataTemplate DataType="{x:Type Model:QuestionAnswerModel}"> 
         <StackPanel> 
           <!-- here is the combo box --> 
           <ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left" 
              Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}" 
              ItemsSource="{Binding Options.Source}" 
              DisplayMemberPath="ItemName" SelectedValuePath="ItemID" 
              SelectedValue="{Binding Options.SelectedID, ValidatesOnDataErrors=true}" /> 

          </StackPanel> 
        </DataTemplate> 
       </ItemsControl.Resources> 
      </ItemsControl> 

нерабочим пример:

<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left" 
          Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}" 
          SelectedItem="{Binding Type.SelectedItem, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Validation.Error="ComboBox_Error" 
          ItemsSource="{Binding Type.Source}" 
          DisplayMemberPath="Localized" 
          > 

Они из же XAML файл, то ItemsControl, содержащий рабочий ComboBox находится в той же сетке, как нерабочий ComboBox.

Единственное отличие заключается в том связан SelectedItem или SelectedValue, но это не должно быть никаких подшипников на проверки ...

+1

Вы можете загрузить рабочий пример для своей проблемы? – blindmeis

+0

@blindmeis: пример загружен – TDaver

+0

Вы можете проверить свои настройки во время исполнения с помощью Snoop? Validation.ErrorTemplate ValueSource должен быть стилем в вашем случае. Я не получаю ваш код работать, потому что я пропустил проверку и так далее. – blindmeis

ответ

1

я имел точную проблему с шаблоном ошибки не отображается, даже если событие пили, и никогда не мог понять, почему это произошло только для некоторых контролей, а не для других.

Обходной В конце концов я нашел в том, чтобы установить ValidationStep в ConvertedProposedValue на ValidationRule для связывания:

<TextBox> 
    <TextBox.Text> 
    <Binding Path="MyField"> 
     <Binding.ValidationRules> 
     <Validation:MyValidationRule ValidationStep="ConvertedProposedValue" Message="Please enter a value." /> 
     </Binding.ValidationRules> 
    </Binding> 
    </TextBox.Text> 
</TextBox> 

Это, казалось, сделать трюк для меня все равно!

EDIT: Если вы используете IDataErrorInfo, вы могли бы попробовать (хотя лично я не тестировал):

<Binding Path="MyField" ValidatesOnExceptions="True"> 
    <Binding.ValidationRules> 
    <DataErrorValidationRule ValidationStep="ConvertedProposedValue" /> 
    </Binding.ValidationRules> 
</Binding> 

т.е. удалить ValidatesOnDataErrors=True, что это просто ярлык для включения одного <DataErrorValidationRule />

+0

Не могли бы вы мне сослаться на что-то, как вы пришли к этому? Мне никогда не приходилось использовать ручной валидатор! – TDaver

+0

также сообщение должно поступать из данных (атрибуты ...), так как я могу заполнить THAT? – TDaver

+0

Я подклассифицирую System.Windows.Controls.ValidationRule с моим собственным классом в соответствии с моими потребностями. Если вы используете IDataErrorInfo, вы можете попробовать то же самое (см. Отредактированный пост). – Ross

0

я хотел бы проверить следующее:

  • проверки DataContext и обязательными для выпадающего списка, если он работает и IDataErrorInfo называется (я предполагаю, что вы делаете IDataErrorInfo проверка) - следующий шаг
  • скопировать шаблон проверки в качестве локального ресурса к вашему ComboBox.Resources и проверить, работает ли он

тем не менее это было бы хорошо, если вы разместите шаблон проверки, ваш COMBOBOX XAML и ваш DataContext

+0

первая проверка определенно работает, вторая - я предполагаю, что это тоже так, потому что текстовое поле RIGHT UNDER не работает combobox видит шаблон ... – TDaver

+0

Я добавил свое дальнейшее исследование к исходному сообщению. еще не повезло :( – TDaver