我想将自定义AttachedProperty的值绑定到ToolTip的内容。
绑定有效,但仅限于工具提示的第二个开口。当第一次打开工具提示时,绑定具有FallbackValue。
奇怪的是,它适用于“默认”AttachedProperties,例如Grid.Row。
任何人都可以解释一下吗?
代码非常简单:
<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="It doesn't work"}" />
</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);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
编辑1:解决方案和一个新问题:
当我在工具提示中再次定义命名空间“local”时,我发现它有效:
<ToolTip xmlns:local="clr-namespace:Test" DataContext=...
BUT
如果您想在某个样式中执行此操作,则会收到错误
"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="It doesn't work"}" />
</ToolTip>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<Button local:AttachedProperty.TestProperty="Now it works!" Content="Button" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
答案 0 :(得分: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。
编辑:参考有关将工具提示放入样式的编辑。你可以这样写:
<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="It doesn't work"}" />
</ToolTip>
<Style TargetType="Button">
<Setter Property="ToolTip" Value="{StaticResource ButtonToolTip}"/>
</Style>
</Grid.Resources>