Wpf 将控件上的属性绑定到工具提示中的控件时出现问题

Wpf 将控件上的属性绑定到工具提示中的控件时出现问题,wpf,data-binding,tooltip,Wpf,Data Binding,Tooltip,我的应用程序使用WPF作为表示层。我的代码中有一个UserControl,其XAML如下所示: <UserControl x:Class="CarSystem.CustomControls.ReadPushPin" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/200

我的应用程序使用WPF作为表示层。我的代码中有一个
UserControl
,其XAML如下所示:

<UserControl x:Class="CarSystem.CustomControls.ReadPushPin"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:cs="clr-namespace:CarSystem.CustomControls"
             mc:Ignorable="d"
             DataContext="{Binding Path=Read, RelativeSource={RelativeSource Self}}"
             d:DesignHeight="30"
             d:DesignWidth="30">

    <UserControl.Resources>
        <cs:BooleanToVisibilityConverter x:Key="BoolToVisibility" True="Visible" False="Collapsed" />
        <cs:DateConverterForRadDateTimePicker x:Key="DateConverter" />
    </UserControl.Resources>

    <Image Name="MarkerImage"
           Source="{Binding Path=Source, RelativeSource={RelativeSource AncestorType={x:Type cs:ReadPushPin}}}">
        <Image.ToolTip>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Image Grid.Column="0"
                       Grid.ColumnSpan="2"
                       Grid.Row="0"
                       Height="45"
                       HorizontalAlignment="Center"
                       Source="{Binding Path=ThumbnailImage, RelativeSource={RelativeSource AncestorType={x:Type cs:ReadPushPin}}}"
                       Visibility="{Binding Converter={StaticResource BoolToVisibility}, Path=HasThumbnail, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type cs:ReadPushPin}}}"
                       Width="60" />
                <TextBlock Grid.Column="0"
                           Grid.Row="1"
                           HorizontalAlignment="Right"
                           Text="Plate:" />
                <StackPanel Grid.Column="1"
                            Grid.Row="1"
                            HorizontalAlignment="Left"
                            Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Plate}" />
                    <TextBlock Text=", " />
                    <TextBlock Text="{Binding Path=State}" />
                </StackPanel>
                <TextBlock Grid.Column="0"
                           Grid.Row="2"
                           HorizontalAlignment="Right"
                           Text="Time:" />
                <TextBlock Grid.Column="1"
                           Grid.Row="2"
                           HorizontalAlignment="Left"
                           Text="{Binding Converter={StaticResource DateConverter}, Path=TimeStamp}" />
                <TextBlock Grid.Column="0"
                           Grid.Row="3"
                           HorizontalAlignment="Right"
                           Text="Nearest Address:" />
                <TextBlock Grid.Column="1"
                           Grid.Row="3"
                           HorizontalAlignment="Left"
                           Text="{Binding Path=NearestAddress, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type cs:ReadPushPin}}}" />
                <TextBlock Grid.Column="0"
                           Grid.Row="4"
                           HorizontalAlignment="Right"
                           Text="Cross Street:" />
                <TextBlock Grid.Column="1"
                           Grid.Row="4"
                           HorizontalAlignment="Left"
                           Text="{Binding Path=CrossStreet, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type cs:ReadPushPin}}}" />
            </Grid>
        </Image.ToolTip>
    </Image>
</UserControl>
我做错了什么?如何使绑定正常工作


Tony

每当计算相对绑定并且找不到指定的父项时,就会出现此错误。您要求它查找ReadPushPin控件,但在可视化树中找不到它

查看代码,我想您的ReadPushPin就是这里指定的UserControl。然后您应该将相对源祖先类型设置为UserControl。那就行了

另外,我假设您正在该控件上设置DataContext,并尝试使用relativeSource从中获取绑定值。只要当前元素datacontext为null,绑定引擎就会找到第一个非null父datacontext,因此可以像


它将查找用户控件的可视层次结构,并获取其数据上下文。

我认为问题与工具提示与其所属控件不在同一可视树中有关

我通过在工具提示模板中为每个控件的视图模型对象添加属性来解决这个问题。由于我需要包含一个缩略图图像,并且将图像作为字节数组存储在数据库中,因此我编写了一个类,该类实现了将字节数组转换为位图图像的IValueConverter


这一切都有效。无论如何,谢谢。

我没有在DataContext中找到的任何东西上使用RelativeSource绑定。我将NearestAddress和CrossStreet属性移动到DataContext中的对象&它们即将出现。我现在需要修复的是ThumbnailImage&HasThumbnailProperties。我将尝试将类型更改为UserControl&看看会发生什么。
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='CarSystem.CustomControls.ReadPushPin', AncestorLevel='1''. BindingExpression:Path=CrossStreet; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')