Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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>
like image 301
user235973457 Avatar asked Aug 16 '13 12:08

user235973457


1 Answers

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.

like image 193
Simon Belanger Avatar answered Sep 21 '22 16:09

Simon Belanger