Angepasstes Tooltip für jedes Item einer Listbox

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Angepasstes Tooltip für jedes Item einer Listbox

    Hallo,

    ich habe eine Listbox und möchte für jedes Item einen anderen Tooltip anzeigen lassen:

    <ListBox SelectionMode="Multiple" ItemsSource="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Musiktitel"/>

    Und zwar soll der Tooltip dann sowas anzeigen:

    01
    Michael Jackson
    HIStory
    Billie Jean
    03:49

    Die Daten sind in AnzuzeigendeMusiktitel als Properties drin.

    Ich will also sowas in der Art:

    XML-Quellcode

    1. <ListBox>
    2. <ListBoxItem>
    3. <Listbox.Tooltip>
    4. <StackPanel>
    5. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Tracknummer"/>
    6. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Interpret"/>
    7. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Album"/>
    8. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Musiktitel"/>
    9. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Dauer"/>
    10. </StackPanel>
    11. </Listbox.Tooltip>
    12. </ListBoxItem>
    13. </Listbox>


    Leider kommt der Fehler: "Das Element DisplayMemberPath wurde nicht erkannt. oder es kann nicht auf das Element zugegriffen werden."

    Kann mir jemand helfen? Wie mache ich das sonst?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    Moinsen.

    Ein Tipp: Das mit dem DisplayMemberPath, ist nur Vorgesehen für eine einzelne Eigenschaft, die angezeigt werden soll.

    In deinem Fall solltest du von DisplayMemberPath auf eine ItemTemplate für die Gestaltung der Listenelemente der ListBox/ComboBo umstellen.

    Tip zu dem ToolTip:

    XML-Quellcode

    1. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Tracknummer"/>
    2. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Interpret"/>
    3. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Album"/>
    4. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Musiktitel"/>
    5. <Textblock Text="{Binding AnzuzeigendeMusiktitel}" DisplayMemberPath="Dauer"/>


    dieses hier verwenden...

    XML-Quellcode

    1. <Textblock Text="{Binding .Tracknummer}"/>
    2. <Textblock Text="{Binding .Interpret}"/>
    3. <Textblock Text="{Binding .Album}"/>
    4. <Textblock Text="{Binding .Musiktitel}"/>
    5. <Textblock Text="{Binding .Dauer}"/>


    Der Super Duper Punkt im Binding referenziert auf das (aktuelle) "Item/Element" in der Auflistung.

    Denn im Element/ListBoxItem/ComboBoxItem ist ja dein Objekt, was mit hilfe der Punktnotation, die Eigenschaften direkt ansprechen kann.

    Hoffe das Hilft, habe das nicht getestet.

    c.u. joshi aus chilled HH ;)
    @Joshi

    Thx Namenskollege ich probiers mal aus...

    Grüssle ausm Süden :)

    @Joshi
    Also das mit den Punkten funktioniert nicht >> UngültigeEigenschaftenpfadsyntax...
    Aber wenn man die Punkte weglässt meckert er zumindest nicht.

    Allerdings wenn ich das Programm dann starte, kommt ein Fehler (Zeilennummer 32 entspricht Zeile 2 in meinem Code in Post1):

    System.Windows.Markup.XamlParseException
    HResult=0x80131501
    Nachricht = Zeilennummer "32" und Zeilenposition "14" von "Durch Hinzufügen eines Werts zu einer Sammlung vom Typ "System.Windows.Controls.ItemCollection" wurde eine Ausnahme ausgelöst.".
    Quelle = PresentationFramework
    Stapelüberwachung:
    bei System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
    bei System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
    bei System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
    bei System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
    bei VamosALaPlayer_3._0.View.Suche.InitializeComponent() in F:\Ablage\VALP 3.0\VamosALaPlayer 3.0\VamosALaPlayer 3.0\VamosALaPlayer_3._0.View\Suche.xaml: Zeile1

    Innere Ausnahme 1:
    InvalidOperationException: Der Vorgang ist während der Verwendung von "ItemsSource" ungültig. Verwenden Sie stattdessen "ItemsControl.ItemsSource", um auf Elemente zuzugreifen und diese zu ändern.

    Ich verstehs nicht... ;(

    PS:

    Joshi schrieb:

    In deinem Fall solltest du von DisplayMemberPath auf eine ItemTemplate für die Gestaltung der Listenelemente der ListBox/ComboBo umstellen.

    Das ist schon so gewollt. In der Listbox sollen nur die Musiktitel angezeigt werden, und dann mit dem Tooltip weitere Informationen angezeigt werden...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()

    Uupsie... Sorry... Joshi an Joshi ;)

    XML-Quellcode

    1. <ListBox ItemsSource="{Binding Source={Binding AnzuzeigendeMusiktitel}}">
    2. <ListBox.ItemTemplate>
    3. <DataTemplate>
    4. <TextBlock Text="{Binding Path=Musiktitel}" ToolTipService.ToolTip="{Binding Path=ToolTipZumAnzeigen}"/>
    5. </DataTemplate>
    6. </ListBox.ItemTemplate>
    7. </ListBox>


    ToolTipZumAnzeigen ist dann eine Eigenschaft, zusätzlich in deiner Klasse/Objekt, und das sollte den ToolTipText (zusammengesetz) enthalten.

    Mehr fällt mir gerade nicht ein...

    Verdammter Punkt, ist wiedermal ´n Doppelpunkt...

    c.u. Vetter of da Name :)
    Yep, aber der blöde Fehler bleibt.

    Der tritt übrigens hier auf:

    VB.NET-Quellcode

    1. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    2. lstColors.ItemsSource = ErmittelteFarben
    3. 'ItemsControl.ItemsSource = ErmittelteFarben
    4. Resources("VordergrundfarbeBrush") = New SolidColorBrush(Colors.Aquamarine)
    5. Resources("Vordergrundfarbe") = Colors.Aquamarine
    6. Resources("ButtonHighlightFarbe") = New SolidColorBrush(Colors.Aquamarine)
    7. End Sub


    In Zeile 2:
    lstColors.ItemsSource löste eine Ausnahme des Typs 'System.NullReferenceException' aus.

    Ich verstehe nicht was denn jetzt lstColors damit zu tun hat??

    Edit: So und nach stundenlangem Rumprobieren hab ich den Fehler wegbekommen, frag jetzt aber nicht wie... ich glaub da war was im Code Behind (Zeilen 4-6), das hab ich durch XAML ersetzt...

    Jedenfalls vielen Dank für deinen Einsatz :)

    So sieht es jetzt aus:

    XML-Quellcode

    1. <ListBox SelectionMode="Multiple" ItemsSource="{Binding AnzuzeigendeMusiktitel}">
    2. <ListBox.ItemTemplate>
    3. <DataTemplate>
    4. <TextBlock Text="{Binding Path=Musiktitel}">
    5. <ToolTipService.ToolTip>
    6. <StackPanel>
    7. <TextBlock Text="{Binding Path=Tracknummer}"/>
    8. <TextBlock Text="{Binding Path=Interpret}"/>
    9. <TextBlock Text="{Binding Path=Album}"/>
    10. <TextBlock Text="{Binding Path=Musiktitel}"/>
    11. <TextBlock Text="{Binding Path=Dauer}"/>
    12. <TextBlock Text="{Binding Path=Genre}"/>
    13. </StackPanel>
    14. </ToolTipService.ToolTip>
    15. </TextBlock>
    16. </DataTemplate>
    17. </ListBox.ItemTemplate>
    18. </ListBox>

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kafffee“ ()

    ErfinderDesRades schrieb:

    ist das Xaml richtig, dass da in ein ListboxItem ein Listbox.Tooltip eingeschachtelt wird?

    kafffee schrieb:

    Er bringt jedenfalls keinen Fehler...
    Naja, Xaml ist ja so eine fortschrittliche Technologie, die loggt Fehler meist einfach nur ins Ausgabefenster (oder noch woanders hin), und tut ansonsten nicht, was sie soll.
    Echt geil zu debuggen - danke Wpf!
    Hi. Jugendwort des Jahres 2021 "Cringe"...

    Tatsächlich geht es mit Punktnotation und mit ohne...

    "Naah? Jetzt schon gecringed?"

    XML-Quellcode

    1. <DataTemplate x:Key="BetriebItemTemplate" DataType="Models.Betrieb">
    2. <Grid ToolTipService.ShowDuration="12000">
    3. <Grid.ToolTip>
    4. <StackPanel>
    5. <TextBlock Text="{Binding Name}" />
    6. <TextBlock Text="{Binding .EmailAdresse}" />
    7. </StackPanel>
    8. </Grid.ToolTip>
    9. <Border...


    Ich habe ein Grid, das in der ListBox ein Item darstellt, diesem dann ein Tooltip-XAML-Element untergeordnet und es geht... :)

    ToolTipService.ShowDuration="12000" im Eltern-Element kann die ToolTip-Anzeigedauer steuern (in Millisekunden = 12 Sekunden).

    @ErfinderDesRades
    Ich nehme einmal an das das so gewollt ist mit der möglichkeit ToolTips als Kinder-Elemente einzubauen.
    Damit könnten ToolTip´s pro Kind-Element gesetzt werden.
    Einmal Angenommen es gibt ein "Ansprechpartner" der bekommt ein ToolTip,
    und ein Icon das ein anderne ToolTip erhält.

    @kafffee

    lstColors.ItemsSource = ErmittelteFarben
    ErmittleFarben hat einen Rückgabewert?
    Hast es ja irgendwie gelöst, aber die Fehlermeldung bedeutet kein Objekt ist "erzeugt" worden sollen sein... Ab hier verliessen ihn die Grammatik-Geister... ;)

    c.u. Joshi :whistling:
    @Joshi

    Ja das hat einen Rückgabewert. Weil hat ja immer funktioniert. Erst als ich dann diese Tooltips programmiert hab trat der Fehler auf... Was das dann damit überhaupt zu tun hatte ist mir bis jetzt schleierhaft...

    Interessant vielleicht das "Durch Hinzufügen eines Werts zu einer Sammlung vom Typ "System.Windows.Controls.ItemCollection" wurde eine Ausnahme ausgelöst.".