2

私が達成したいこと:

TextBox内にかなり単純なデータ検証を実装しようとしています。検証ルールが満たされていない場合、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>

テキストボックステンプレート/スタイル:

<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コードは大幅に削減されています(レイアウトに関するコードのみ)。


問題:

私が直面している問題は、ToolTipTextBlockのバインディングにエラーが表示されないように見えることです。

それ以外は、他のすべてが完全に機能します(DataValidationは期待どおりであり、TextBoxの境界線が青に変わります)。

私は何かが足りないことはほぼ確実で、何を解決できないようです-それはおそらく非常に単純なことです!

よろしくお願いします。


編集:

これは、テンプレートでツールチップを設定する方法の問題です。なぜそれが機能しないのかはまだわかりませんが、問題は私が最初に考えたものよりもはるかに単純です!だから今、問題はなぜバインディングがTextBlock内で機能しないのかということだと思います。

'TextBox.ToolTip'に直接割り当てる場合と同じように、この方法で行う必要があります。文字列に変換されるため、コードでToolTipにアクセスできなくなります(これは要件です)。

4

1 に答える 1

0

「ToolTip」のセッターを次のように変更します。

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

使用するときは、ツールチップの にSelfバインドしTextBlockます。

これでうまくいかない場合はRelativeSource.FindAncestor、祖先のタイプを に設定してみてくださいTextBox

于 2012-09-04T11:11:48.460 に答える