Binden einer Combobox mit Checkboxen gefüllt an eine Klasse

  • WPF

Es gibt 49 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    ErfinderDesRades schrieb:

    Ich frage mich, ob und wo der Text, den ich in die Textbox eingebe, dann gespeichert wird.
    SelectedItem ist ja Nothing.



    Na ich hab eine Property im VM die daran gebunden ist. Wie @Nofear23m sagte, es geht darum die Suche zurückzusetzen. Ich will in meinem Programm entweder per Textbox filtern oder per Klick auf ein Item. Und wenn ich was in die Textbox eingebe, soll die Suche per angeklicktem Item zurückgesetzt werden...
    Mein Fehler. IsSelected, nicht Focused.
    https://social.msdn.microsoft.com/Forums/vstudio/en-US/99710d01-e064-4053-ac0a-8a46ab6cf761/multiple-selection-with-listbox-in-mvvm?forum=wpf

    Warte mal. Reden wir jetzt von Fokus oder Selected? Kenn mich schon gar nicht mehr aus vor lauter Threads von dir!!
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    OK, Thread nochmals überflogen, ja, wir reden davon das du auslesen willst welche Items selektiert sind, dann passt mein Link eh.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Wir hatten drei verschiedene Problemstellungen:

    (1) Die Selected-Items einer Listbox auslesen, und diese einer Obsverablecollection zuweisen. Hat sich erledigt, hab mich entschieden, das anders zu lösen (das war glaube ich in einem anderen Thread)
    (2) Das Selected-Item einer Listbox auslesen, um die Daten einer anderen Listbox zu filtern. > Hab ich hinbekommen
    (3) Wenn eine Textbox den Focus bekommt, sollen die Selektionen der Listboxen zurückgesetzt werden...

    Es geht also um (3). Habs jetzt nochmal probiert, nachdem ich in den Microsoft Docs mal nachgeschlagen hab, dass Textboxen, wie du sagst, tatsächlich eine Eigenschaft IsFocused haben. Ich begründete meine Frage auf die Tatsache, dass mir IntelliSense keine IsFocused-Eigenschaft angeboten hat. Jetzt hab ichs mal mit der Brechstange versucht und das einfach ohne IntelliSense reingeschrieben, jetzt kommt aber der Fehler:

    Die "Isfocused"-Eigenschaft verfügt über kein Setter-Objekt, auf das zugegriffen werden kann, obwohl die Property, an die ich gebunden hab, über einen Setter verfügt:

    VB.NET-Quellcode

    1. Private _SucheFokussiert As Boolean
    2. Public Property SucheFokussiert As Boolean
    3. Get
    4. If _SucheFokussiert = Nothing Then Return False
    5. Return _SucheFokussiert
    6. End Get
    7. Set(value As Boolean)
    8. If value = True Then
    9. AusgewählterInterpret = Nothing
    10. AusgewähltesAlbum = Nothing
    11. 'AusgewählteMusiktitel = Nothing
    12. TextFilter = ""
    13. End If
    14. _SucheFokussiert = value
    15. RaisePropertyChanged()
    16. End Set
    17. End Property


    Weder Google noch Bing liefert irgendwelche Treffer, wenn ich danach suche...

    kafffee schrieb:

    Weder Google noch Bing liefert irgendwelche Treffer

    Aber die Fehlermeldung...

    Die sagt doch alles!

    kafffee schrieb:

    obwohl die Property, an die ich gebunden hab, über einen Setter verfügt

    Ja, aber darauf will die Fehlermeldung nicht hinaus. Die Fehlermeldung sagt Die "Isfocused"-Eigenschaft verfügt über kein Setter-Objekt . Du musst korrekt und sinnerfassend lesen.
    Die IsFocused Eigenschaft der TextBox ist eine ReadOnly Eigenschaft, weshalb du mit OneWayToSource binden musst. Logisch oder?

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Geht nicht. Spinn ich denn??:

    <TextBox Text="{Binding TextFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsFocused="{Binding SucheFokussiert, Mode=OneWayToSource}"/>

    Da kommt jetzt noch ein zweiter Fehler:
    Die Eigenschaft "IsFocused" ist schreibgeschützt und kann nicht von einem Markup aus festgelegt werden...

    Ich lege doch nicht fest oder?
    OK, also ich hab das Probiert. Sorry, du spinnst nicht. IsFocused ist schon ein spezieller Fall mit welchem ich schon länger nicht mehr zu tun hatte da ich sowas total selten benötige.

    Tatsächlich funzt das so nicht, leider. Hierfür wäre die praktikabelste Lösung ein AttachedProperty. Ich habe mal schnell eines erstellt, der Vorteil bei diesem von mir erstelltem ist das du nun den Focus vom ViewModel aus auch setzen könntest. Du kannst nun also auch Steuern wo der Focus hin soll.

    Hier meine Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Public Class FocusExtension
    2. Public Shared ReadOnly IsFocusedProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsFocused", GetType(Boolean?), GetType(FocusExtension), New FrameworkPropertyMetadata(AddressOf IsFocusedChanged))
    3. Public Shared Function GetIsFocused(ByVal element As DependencyObject) As Boolean?
    4. If element Is Nothing Then
    5. Throw New ArgumentNullException("element")
    6. End If
    7. Return CType(element.GetValue(IsFocusedProperty), Boolean?)
    8. End Function
    9. Public Shared Sub SetIsFocused(ByVal element As DependencyObject, ByVal value As Boolean?)
    10. If element Is Nothing Then
    11. Throw New ArgumentNullException("element")
    12. End If
    13. element.SetValue(IsFocusedProperty, value)
    14. End Sub
    15. Private Shared Sub IsFocusedChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    16. Dim fe As FrameworkElement = CType(d, FrameworkElement)
    17. If e.OldValue Is Nothing Then
    18. AddHandler fe.GotFocus, AddressOf FrameworkElement_GotFocus
    19. AddHandler fe.LostFocus, AddressOf FrameworkElement_LostFocus
    20. End If
    21. If CBool(e.NewValue) Then
    22. fe.Focus()
    23. End If
    24. End Sub
    25. Private Shared Sub FrameworkElement_GotFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
    26. DirectCast(sender, FrameworkElement).SetValue(IsFocusedProperty, True)
    27. End Sub
    28. Private Shared Sub FrameworkElement_LostFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
    29. DirectCast(sender, FrameworkElement).SetValue(IsFocusedProperty, False)
    30. End Sub
    31. End Class


    Die packst du einfach ins das View-Projekt und wendest es dann wie folgt an:

    XML-Quellcode

    1. ​<TextBox Text="Hallo" local:FocusExtension.IsFocused="{Binding SucheFokussiert,Mode=TwoWay}"/>


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Soweit so gut. Das funktioniert schon mal. Nur wird mit AusgewählterInterpret = Nothing (diese Eigenschaft hab ich eh schon, auf SelectedItem gebunden) nichts deselektiert. Nur wenn ich den SelectedIndex auf eine extra Property binde und auf -1 setze funktioniert es.

    Geht das auch irgendwie über SelectedItem oder muss ich den Umweg über SelectedIndex gehen?

    kafffee schrieb:

    Nur wird mit AusgewählterInterpret = Nothing

    What, um das geht hier doch garnicht, es ging hier um den Fokus!

    Aber um das abzukürzen:

    XML-Quellcode

    1. ​<ListBox IsSynchronizedWithCurrentItem="True"
    2. SelectedValue="{Binding MyProperty}" .../>
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##