Триггер со списком wpf для Validation.HasError

Я огляделся, но не могу найти конкретно свою проблему. Я знаю, что обработка «Ошибка» по умолчанию в WPF помещает «Украшение» вокруг элементов управления на случай, если возникнут какие-либо ошибки, основанные на правилах IDataErrorInfo или Validataion, не отвечающих данному элементу управления. Это все хорошо и прекрасно, однако с интерфейсом страницы с вкладками, если какие-либо элементы управления помечены как недействительные, они должным образом обведены красной рамкой. Однако, как только вы переходите с вкладки 1 на 2 и обратно на 1, все украшения исчезают (плохо). Об этом уже спрашивали, и решение было принято, но искали лучшую альтернативу.

Итак, я перешел к своему объявлению «Темы» и для элемента управления текстовым полем я просто сказал установить красный цвет всего фона элемента управления, а не только границы. Без какого-либо причудливого принудительного запуска через уведомление об изменении свойства, если я переключаюсь между страницами, красный фон всего текстового поля остается постоянным.

Теперь перейдем к управлению выпадающим списком. Для тех, кто настроил свой собственный или даже посмотрел версию элемента управления MS по умолчанию, на самом деле это сгруппированный беспорядок элементов управления, сеток, столбцов, кнопок и т. Д., Чтобы магия выпадающего списка работала. Вкратце...

ControlTemplate Сетка (два столбца, один для отображения текста выбранного, второй столбец для стрелки раскрывающегося списка) Граница, охватывающая оба столбца Путь (рисунок линии / глиф для раскрывающегося изображения для поля со списком)

ControlTemplate TargetType Текстовое поле (как часть всего набора выпадающих списков) Граница специально "PART_ContentHost"

ControlTemplate выпадающего списка кнопки переключения сетки со списком, отображающего список других триггеров.

Наконец, основное объявление ComboBox, созданное по шаблону вышеуказанных компонентов.

Во всяком случае, я не могу получить это. В области «Кнопка переключения» объявления со списком у меня есть триггер для изменения фона на ОЧЕВИДНЫЙ цвет для доказательства проверки работы триггера и в правильном месте в объявлениях ControlTemplate.

Итак, зная, что это правильное место в объявлениях со списком, я хочу заменить зеленый цвет фона красным, если есть ошибка с данными. Я ЗНАЮ, что общий «Validation.HasError» правильно запускается, как показывает собственный обработчик ошибок. Независимо от того, как/где в шаблоне я пытаюсь изменить цвет фона на красный, это НЕ работает. Я даже пытался использовать DataTriggers, используя конвертеры, пробуя несколько свойств, но, похоже, это не работает.

Какие-либо предложения? Это становится действительно раздражающим.


person DRapp    schedule 07.05.2012    source источник


Ответы (1)


НАКОНЕЦ-ТО понял... и не так очевидно, как я предполагал. Во всяком случае, вот что я нашел. Если вы использовали образец из шаблона Microsoft со списком, они сначала предоставляют общее двухколоночное объявление «ToggleButton».

<ControlTemplate TargetType="ToggleButton" 
   x:Key="baseComboBoxToggleButton" >

  ... blah blah...

</ControlTemplate>

Затем объявление для «Отображаемого значения» поля со списком

<ControlTemplate TargetType="TextBox" x:Key="ComboBoxTextBox" >
   <Border x:Name="PART_ContentHost" Focusable="False" 
           Background="{TemplateBinding Background}" />
</ControlTemplate>

Затем свяжите их вместе как одно объявление «обертки» Combobox.

<ControlTemplate TargetType="ComboBox" x:Key="ComboBoxGridControlTemplate" >
   <Grid x:Name="GridComboWrapper">
      <!-- This is the dropdown button that POINTS TO THE "baseComboBoxToggleButton at the top -->
      <ToggleButton Name="ToggleButton" 
        Template="{StaticResource baseComboBoxToggleButton}" 
        Grid.Column="2" Focusable="false"
        IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay,
                RelativeSource={RelativeSource TemplatedParent}}"
                ClickMode="Press" >
      </ToggleButton>

      ...
      rest of the content presenter,
      EDIT(able) textbox area,
      popup area of combobox when in drop-down mode

   </Grid> 


   <ControlTemplate.Triggers>

      <!-- PUT THE VALIDATION CHECK HERE -->
      <Trigger Property="Validation.HasError" Value="true">
         <Setter Property="ToolTip" 
                 Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                 Path=(Validation.Errors)[0].ErrorContent}"/>


         <!-- THIS IS THE CRITICAL COMPONENT... I HAD TO EXPLICITLY TELL
              The TagetName as the "ToggleButton" and change ITs Background property
              and it now works -->
         <Setter TargetName="ToggleButton" Property="Background" 
                 Value="{StaticResource BrushDataInvalidBorder}" />
      </Trigger>

   </ControlTemplate.Triggers>
</ControlTemplate>

Итак, теперь он работает так, как задумано, и не теряет никакого украшения только потому, что активная страница в данной форме изменяется и очищает его... его статика для каждого отдельного элемента управления, как и ожидалось... Вау... что это за PITA был.

Надеюсь, это поможет кому-то ДРУГОМ в будущем от чрезмерного удара головой о стену при изучении этого вложенного уровня материала.

person DRapp    schedule 29.05.2012