Проверка IDataErrorInfo не дает никакого ErrorContent (см. Редактирование)

Чего я хочу добиться:

Я пытаюсь реализовать довольно простую проверку данных в TextBoxes. Если правила проверки не соблюдены, граница TextBox становится красной, и в ее подсказке отображается сообщение об ошибке.

Я делаю это, используя IDataErrorInfo и Styles/Bindings:

Реализация IDataErrorInfo:

#region DataError Members
public string Error
    { 
        get { return null; } 
    }

    public string this[string propertyName]
    {
        get
        {
            string result = null;

            if (propertyName == "Answer")
            {
                if (Answer != null)
                {
                   if (this.Answer.Length < 1 || this.Answer.Length > 10)
                       result = "Invalid answer length - Must be between: 1 and 10 chars.";                        
                }
            }
            return result;
        }
    }
#endregion

TextBox, который содержит привязку:

<TextBox       
     Style="{DynamicResource GeneralTextBoxStyle}"
     >
     <TextBox.Text>
         <Binding  
             Path="Answer" 
             Mode="TwoWay" 
             UpdateSourceTrigger="PropertyChanged"
             ValidatesOnDataErrors="True"
             ValidatesOnExceptions="True"                        
          />
     </TextBox.Text> 
</TextBox>

Шаблон / Стиль TextBox:

<ControlTemplate x:Key="ErrorTextBoxTemplate" TargetType="{x:Type TextBox}">
    <Border 
        x:Name="ErrorBorder" 
        BorderThickness="1"
        BorderBrush="White"
        >
        <ScrollViewer 
            x:Name="PART_ContentHost"
            VerticalAlignment="Center"
            >
            <ScrollViewer.ToolTip>
                <ToolTip FontSize="14">
                    <TextBlock x:Name="ToolTip"/>
                </ToolTip>
            </ScrollViewer.ToolTip>
        </ScrollViewer>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter TargetName="ToolTip" Property="Text" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
            <Setter TargetName="ErrorBorder" Property="BorderBrush" Value="Blue"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

<Style x:Key="ErrorTextBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Template" Value="{StaticResource ErrorTextBoxTemplate}"/>
</Style>

Примечание. Код XAML был значительно сокращен (код касается только макета).


Эта проблема:

Проблема, с которой я сталкиваюсь, заключается в том, что привязка к всплывающей подсказке TextBlock никогда не показывает никаких ошибок.

Кроме этого, все остальное работает отлично (DataValidation, как и ожидалось, и граница моего TextBox становится синим).

Я почти уверен, что что-то упустил, и я не могу тренироваться, что... Это, наверное, что-то чрезвычайно простое!

Заранее спасибо за ваши ответы.


РЕДАКТИРОВАТЬ:

Это проблема с тем, как я настроил всплывающую подсказку в шаблоне. До сих пор не уверены, почему это не работает, однако проблема намного проще, чем я думал! Итак, теперь я предполагаю, что вопрос заключается в том, почему привязка не работает внутри TextBlock?

Мне нужно сделать это таким образом, как если бы я назначил непосредственно TextBox.ToolTip, я больше не могу получить доступ к подсказке в коде (что является обязательным), так как она преобразуется в строку.

1 ответ

Измените установщик для "всплывающей подсказки" на:

<Setter TargetName="ToolTip" Property="Text" Value="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=(Validation.Errors)[0].ErrorContent}"/>

Когда вы используете Self вы связываете с TextBlock в твоей подсказке.

Если это не работает, попробуйте RelativeSource.FindAncestor с типом предка, установленным на TextBox,

Другие вопросы по тегам