Width-Binding an ListBox

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Width-Binding an ListBox

    Hallo VBP-Forum,
    ich bin dabei einen Chat zu entwickeln (siehe auch hier).
    Ich möchte, dass die Nachrichten eine Breite bekommen, welche 9/10 der ListBox beträgt.

    Dazu habe ich das Binding mit einem Converter verwendet.
    Allerdings bleiben die Nachrichten so klein, dass der Text so reinpasst - sie passen sich also dem Inhalt an.
    Das möchte ich aber nicht, weshalb ich folgenden XAML-Code für das Binding verwendet habe:

    XML-Quellcode

    1. Width="{Binding Width, ElementName=messages, Converter={StaticResource ChatMaxWidth}}"

    Dabei ist das Element 'messages' die ListBox und der Converter enthält folgenden Code:

    VB.NET-Quellcode

    1. Public Class ChatMaxWidthConverter
    2. Implements System.Windows.Data.IValueConverter
    3. Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
    4. Dim dbl As Double = CDbl(value)
    5. dbl = dbl / 10 * 9
    6. Return dbl
    7. End Function
    8. Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
    9. Throw New NotImplementedException()
    10. End Function
    11. End Class


    Es funktioniert auch anstandslos, allerdings nur, wenn die ListBox eine feste Größe hat.
    Wenn die ListBox aber eine dynamische Größe besitzt, also Width=Auto, wird mir in der Ausgabe folgender Fehler angezeigt:
    System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='NaN' BindingExpression:Path=Width; DataItem='ListBox' (Name='messages'); target element is 'Grid' (Name=''); target property is 'Width' (type 'Double')


    Jetzt meine Frage: Ist es irgendwie möglich, trotzdem erfolgreich an die ListBox zu binden ?
    eine noch bessere Lösung wäre, du würdest das RenderTransform des ListboxItems auf 0.9 setzen. Dann könnteste auf den doofen Converter verzichten (also ich finds ziemlich abartig von Xaml, dass man eine eigene Klasse coden muß, nur um einen Wert mit 0.9 zu multiplizieren)

    guggemal in Runde Buttons den IsPressed-Trigger des Button-Templates

    ErfinderDesRades schrieb:

    (also ich finds ziemlich abartig von Xaml, dass man eine eigene Klasse coden muß, nur um einen Wert mit 0.9 zu multiplizieren)
    Muss ich dir wie so oft voll und ganz zustimmen. Ich würde mir da auch noch etwas mehr Erwarten wie z.b. MarkupExtensions oder StandartConverter welche Grundrechenarten und vll. sogar Dinge wie Sinus... herrschen. Aber als kleiner Tipp, ich hab mir da einfach selbst über die Zeit ne kleine Lib zusammengestellt mit vielen verschiedenen Convertern, Commands, Styles usw. was man halt alles in WPF brauchen kann.
    Und die binde ich in jedem WPF Projekt standartmäßig ein, und dadurch habe ich halt z.b. einen MultConverter, AddConverter, SubConverter und für einfache Dinge tun die es meistens :)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.