wpfbindingcontenttemplate

How to Bind ListViewItem's ToolTip to a ToolTip of TextBlock inside its ContentTemplate


I would like to bind my ListViewItem's ToolTip to its ContentTemplate's TextBlock's ToolTip.

I tried the following but it didnt work:

<ListView ItemsSource="{Binding DoestMatter}" >
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="ToolTip" Value="{Binding ElementName=Title, Path=ToolTip}"/>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <TextBlock x:Name="Title" Text="{Binding Title}" ToolTip="Test"/>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

The ToolTip's value is dynamically generated, here I just showed it as static string but actually it isn't, and that's why I need to bind it to the TextBlock's ToolTip.

How can I make it work?


Solution

  • Your code works just fine as it is... well, I had to change some Bindings to get it to work, but the main XAML is fine:

    <ListView ItemsSource="{Binding Tests}" >
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="ToolTip" Value="{Binding ToolTip, ElementName=Title}" />
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock x:Name="Title" Text="{Binding Name}" 
                                ToolTip="Test" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
    

    enter image description here

    However, one thing that I did notice was that it only works if you put your cursor directly over the TextBlock and that was not stretching across the width of the ListViewItem. To fix that, just set the HorizontalContentAlignment property to Stretch:

    <ListView ItemsSource="{Binding Tests}" >
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="ToolTip" Value="{Binding ToolTip, ElementName=Title}" />
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock x:Name="Title" Text="{Binding Name}" 
                                ToolTip="Test" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
    

    UPDATE >>>

    You're right... the ToolTip was still on the TextBlock. Then you just need to update your ToolTip.Binding to *the same value that works on the Text property:

    <ListView ItemsSource="{Binding Tests}" >
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="ToolTip" Value="{Binding ToolTip}" />
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock x:Name="Title" Text="{Binding Title}" 
                                ToolTip="{Binding ToolTip}" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
    

    Now you should see 2 tooltips, one when over the TextBlock and one when over the ListViewItem.


    UPDATE 2 >>>

    @Ron, I really cannot understand why you are taking such a negative reaction to my answer(s)... you really should watch your attitude, because I am trying to help you and I don't feel that I deserve your bad attitude. So, to address your second, even ruder comment:

    1. I said that the HorizontalAlignment is set to Stretch by default

    Really? Where did you say that? In fact, you didn't say that, you said The ListViewItem stretches on default, which is something entirely different. As mentioned in the comment, I was stretching the TextBlock inside the ListViewItem with the HorizontalContentAlignment property, which isn't set to Strecth by default.

    1. Who said that I want the Title as my ToolTip?

    Nobody said that, but you did say The ToolTip's value is dynamically generated... so I can only image that you are Binding your dynamically generated ToolTip. If this is so, then you can simply data Bind that same value to the ListViewItem.ToolTip property as well.


    UPDATE 3 >>>

    In response to your last comment:

    I stick to my question from the beginning because I cant really explain the problem. I know whats the solution though I dont know the practical way. I want to bind to the TextBlock's ToolTip Property.

    Well sorry, but you can't do that in XAML because the TextBlock is declared in a DataTemplate. You can only access DataTemplate generated elements in code because they don't just exist until runtime... see the How to: Find DataTemplate-Generated Elements page on MSDN to find out how to do that. So you'll have to find another way to achieve your goal and that's why I've been suggesting these other methods all along.