3

カスタム AttachedProperty の Value を ToolTip のコンテンツにバインドしたいと考えています。

バインドは機能しますが、ToolTip を 2 回目に開いたときにのみ機能します。ツールチップが初めて開かれるとき、バインディングには FallbackValue があります。

不思議なことに、Grid.Row などの「デフォルト」の AttachedProperties で動作します。

誰もそれを説明できますか?

コードは非常に単純です。

<Button local:AttachedProperty.TestProperty="Now it works!" Content="Button">
    <Button.ToolTip>
        <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
            <TextBlock Text="{Binding (local:AttachedProperty.TestProperty), FallbackValue=&quot;It doesn't work&quot;}" />
        </ToolTip>
    </Button.ToolTip>
</Button>

AttachedProperty のコード:

public static class AttachedProperty
{
    public static readonly DependencyProperty TestPropertyProperty = DependencyProperty.RegisterAttached
    (
        "TestProperty",
        typeof(string),
        typeof(AttachedProperty),
        new FrameworkPropertyMetadata
        (
            string.Empty,
            FrameworkPropertyMetadataOptions.Inherits
        )
    );

    public static string GetTestProperty(FrameworkElement target)
    {
        return (string)target.GetValue(TestPropertyProperty);
    }

    public static void SetTestProperty(FrameworkElement target, string value)
    {
        target.SetValue(TestPropertyProperty, value);
    }
}

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

EDIT 1: 解決策と新しい問題:

ツールチップ内で名前空間「ローカル」を再度定義すると、機能することがわかりました。

<ToolTip xmlns:local="clr-namespace:Test" DataContext=...

しかし

スタイル内でこれを行いたい場合は、エラーが発生します

"XMLNamespace", "Assembly" or "ClrNamespace" not found in Mapping Expression

新しいテスト プロジェクトの XML コードは次のとおりです。

<Grid x:Name="LayoutRoot">
    <Grid.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="ToolTip">
                <Setter.Value>
                    <ToolTip xmlns:local="clr-namespace:Test" DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" >
                <TextBlock  Text="{Binding (local:AttachedProperty.TestProperty), FallbackValue=&quot;It doesn't work&quot;}" />
            </ToolTip>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>

    <Button local:AttachedProperty.TestProperty="Now it works!" Content="Button" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
4

1 に答える 1

2

PropertyChangedCallback にいくつかのトレース出力を追加しました (Inheritsここでは役に立たないため、フラグを削除しました)。

public static readonly DependencyProperty TestPropertyProperty =
    DependencyProperty.RegisterAttached(
        "TestProperty",
        typeof(string),
        typeof(AttachedProperty),
        new FrameworkPropertyMetadata(
            string.Empty,
            (o, e) => Trace.TraceInformation("Setting TestProperty = \"{1}\" on {0}", o, e.NewValue))
);

Visual Studio の出力は、プロパティが見つからないとバインディングが訴える前に、プロパティが設定されていることを証明します。

ToolTipAttachedProperty.vshost.exe Information: 0 : Setting TestProperty = "Now it works!" on System.Windows.Controls.Button
System.Windows.Data Warning: 40 : BindingExpression path error: '(local:AttachedProperty.TestProperty)' property not found on 'object' ''Button' (Name='')'. BindingExpression:Path=(local:AttachedProperty.TestProperty); DataItem='Button' (Name=''); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

おそらくこれを Microsoft に送信する必要があります。

編集: ToolTip をスタイルに配置することについての編集を参照してください。あなたはこれを書くことができます:

<Grid.Resources>
    <ToolTip xmlns:local="clr-namespace:Test" x:Key="ButtonToolTip"
             DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
        <TextBlock Text="{Binding (local:AttachedProperty.TestProperty), FallbackValue=&quot;It doesn't work&quot;}" />
    </ToolTip>
    <Style TargetType="Button">
        <Setter Property="ToolTip" Value="{StaticResource ButtonToolTip}"/>
    </Style>
</Grid.Resources>
于 2012-07-13T08:21:10.867 に答える