2

我希望我的文本框根据验证状态将特定文本显示为工具提示。为此,我目前使用以下代码并且它可以工作:

<TextBox Name="textBox1">
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="False">
                    <Setter Property="ToolTip" Value="{Binding XPath=HelpText/Description, Mode=OneTime}" />
                </Trigger>
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

如果没有错误,则会显示从 xml 文件中读取的描述文本,如果有错误,则会显示验证错误字符串。

问题是现在我必须复制这种样式并将其应用于每个文本框(并更改 XPath,它对于每个文本框都是唯一的),我想要做的是将样式放在 Window.Resources 中以便我可以只需为每个文本框引用它,如下所示:

<TextBox Name="textBox2" Style="{StaticResource TextBoxStyle}" />

但是每个文本框的 XPath 会有所不同,所以我不能只将我的样式放在 Window.Resources 中。如何使特定于实例的 XPath 在样式中可用?有没有办法在不创建新文本框并从 TextBox 派生的情况下做到这一点?我想知道在这种情况下是否可以使用附加属性,但我不知道它们是如何工作的。

提前致谢。

4

2 回答 2

2

I haven't completely tested this, but you could use an attached property Something like:

class ToolTipHelper {
    public static readonly DependencyProperty ToolTipProperty =
            DependencyProperty.RegisterAttached("ToolTip", typeof(string) ...

Then you modify your trigger:

<Trigger Property="Validation.HasError" Value="False">
  <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ToolTipHelper.ToolTip}, Mode=OneTime}" />
</Trigger>

And you use it like

<TextBox ToolTipHelper.ToolTip="{Binding XPath=HelpText/Description, Mode=OneTime}" />
于 2013-04-17T13:37:00.953 回答
0

您可以使用Tag 属性并将您的样式更改为

<Style TargetType="{x:Type TextBox}">
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" />
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
        </Trigger>
    </Style.Triggers>
</Style>

然后你将期望绑定到每个特定XPath的属性TagTextBox

<TextBox Tag="{Binding XPath=HelpText/Description, Mode=OneTime}" />
于 2013-04-17T13:34:43.117 回答