Search code examples
c#wpflistboxlistboxitem

c# wpf - cannot set both DisplayMemberPath and ItemTemplate


I want to add tooltip in listboxItem but it starts problem when there is DisplayMemberPath. Error message said:

cannot set both DisplayMemberPath and ItemTemplate.

When I removed DisplayMemberPath, tooltip in each list item is working. But i dont want to remove DisplayMememberPath because I need it. How to solve this problem?

<ListBox x:Name="lstToys" Style="{DynamicResource ListBoxStyle1}"
            ItemsSource="{Binding Strings}" DisplayMemberPath="Toys"
            MouseDoubleClick="lstToys_MouseDoubleClick">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" ToolTip="Here is a tooltip"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Solution

  • DisplayMemberPath is, in effect, a template for a single property, shown in a TextBlock. If you set:

    <ListBox x:Name="lstToys" Style="{DynamicResource ListBoxStyle1}"  
             ItemsSource="{Binding Strings}" DisplayMemberPath="Toys">
    </ListBox>
    

    It is equivalent to:

    <ListBox x:Name="lstToys" Style="{DynamicResource ListBoxStyle1}"  
             ItemsSource="{Binding Strings}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Toys}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    You can simply remove the DisplayMemberPath path and use the value in your DataTemplate's Binding:

    <ListBox x:Name="lstToys" Style="{DynamicResource ListBoxStyle1}"  
             ItemsSource="{Binding Strings}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Toys}" ToolTip="Here is a tooltip!"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    Edit

    If you want to set a ToolTip but keep the DisplayMemberPath, you can do it at the ItemContainerStyle:

    <ListBox x:Name="lstToys" Style="{DynamicResource ListBoxStyle1}"  
             ItemsSource="{Binding Strings}" DisplayMemberPath="Toys">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="ToolTip" Value="Here's a tooltip!"/>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
    

    I'd advise against it. Remember that use DisplayMemberPath stops you from any complex binding in your data template.