XAML 如何确定要为工具提示使用哪个DataTemplate?

xyhw6mcr  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(79)

我有一个ResourceDictionary,其中包含几个DataTemplate,这些DataTemplate将用于显示具有以下属性的类:

public MyToolTip ToolTip {get;}

DataTemplate中,有几个控件会将它们的ToolTip属性绑定到此属性。
ResourceDictionary还包含以下(演示)DataTemplate

<DataTemplate DataType="models:MyToolTip">
    <Grid>
        <TextBlock Text="{Binding Details}"/> <!-- MyToolTip class has a Details property -->
    </Grid>
</DataTemplate>

我如何在ResourceDictionary的根级别声明无论何时显示MyToolTip示例,都将使用上面的DataTemplate

l2osamch

l2osamch1#

感谢您的回复!显然我所尝试的是不可能的。“普通”Xaml属性不支持“自动魔术”DataTemplate选择。
我确实做到了这一点:

<DataTemplate x:Key="MyToolTipDataTemplate">
    <Grid Background="DarkOliveGreen" Width="200" Height="100">
        <TextBlock Text="{Binding Text}"/>
    </Grid>
</DataTemplate>

<Style TargetType="{x:Type editors:SliderEditor}">
    <Setter Property="ToolTip">
        <Setter.Value>
            <ContentControl ContentTemplate="{StaticResource MyToolTipDataTemplate}" Content="{Binding ToolTip}"/>
        </Setter.Value>
    </Setter>
</Style>

使用Style,我可以更改ToolTip属性,但是Style不适用于派生类,也就是说,我需要为每个可能的类型实现带有正确TargetType的样式。而且,我最初想确定 any 控件的 anyToolTip如何呈现,如果它的值是MyToolTip
但是,在这种情况下,将ToolTip设置为最外面的元素(例如SliderEditor)是可以的,无论如何,任何嵌套的控件都会显示相同的工具提示。
此外,在本例中,由于所有编辑器都派生自一个基类,因此我决定执行以下操作,因为这样可以避免编辑所有Xaml文件。
我实现了一个新的UserControl,而不是一个DataTemplate

<UserControl x:Class="Demo.MyToolTipControl">
    <Grid>
        <TextBlock Text="{Binding Path=ToolTip.Text}"/>
    </Grid>
</UserControl>

在基类的ctor中,我添加了:

this.ToolTip = new MyToolTipControl();

注意:我试着让ContentControl“自动神奇地”检测到正确的DataTemplate(当时仍然有一个DataType),就像@Joe在评论中建议的那样,但是没有起作用。因为我选择了一种不同的方法,所以我没有再花更多的时间去寻找原因。

相关问题