私が達成したいこと:
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にアクセスできなくなります(これは要件です)。