Подтвердить что ты не робот

Шаблон ошибки wpf - красная рамка все еще видна при крахе расширителя

Я делаю некоторую проверку на DataSource TextBox, которая находится внутри Expander, и обнаружил, что после того, как была вызвана ошибка проверки, если я скрою Expander, красный ящик останется там, где был бы TextBox.

<Expander Header="Blah Blah Blah">
  <TextBox Name="TextBox"
           Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
           Text="{Binding Path=Blah,
                          UpdateSourceTrigger=PropertyChanged,
                          ValidatesOnDataErrors=True}" />
</Expander>

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

<local:NotVisibleConverter x:Key="NotVisibleConverter" />

<ControlTemplate x:Key="TextBoxErrorTemplate">
  <DockPanel>
    <Border BorderBrush="Red" BorderThickness="2" 
            Visibility="{Binding Path=IsExpanded, 
                                 Converter={StaticResource NotVisibleConverter}, 
                                 RelativeSource={RelativeSource AncestorType=Expander}}" >
      <AdornedElementPlaceholder Name="MyAdorner" />
    </Border>
  </DockPanel>
  <ControlTemplate.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, 
                                Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

Наверное, я поступил не так с моей привязкой, может кто-нибудь вернуть меня в нужное русло? Или кто-нибудь знает другое решение для ErrorTemplate, которое все еще видно при крахе Expander?

4b9b3361

Ответ 1

Вместо того, чтобы делать привязку, вы можете разместить AdornerDecorator вокруг элементов внутри вашего расширителя. Видите ли, шаблон ошибки проверки размещен на слое adorner таким образом, что он появляется поверх всего остального. Это, в конечном счете, ваша проблема. Несмотря на то, что текстовое поле не видно, потому что расширитель закрыт, шаблон ошибки все еще находится на уровне adorner.

Я считаю, что вы можете исправить это со следующим xaml:

<Expander Header="Blah Blah Blah">
   <AdornerDecorator>
      <TextBox Name="TextBox"
               Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
               Text="{Binding Path=Blah,
                              UpdateSourceTrigger=PropertyChanged,
                              ValidatesOnDataErrors=True}" />
   </AdornerDecorator>
</Expander>

Это создает слой adorner специально для расширителя. Когда расширитель закрыт, AdornerDecorator также скрывается, и поэтому все должно быть на нем.

Ответ 2

В общем случае привязки отладки могут выполняться с помощью:

  • Сохранение контрольных точек в конвертере (если вы используете тот, который вы есть)
  • Проверка области вывода в Visual Studio для любых предупреждений об отладке о недопустимых привязках

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

Я подумаю об этом и посмотрю, смогу ли я придумать что-то более полезное.