Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVVM (Visual Basic) - Combobox aktualisiert sich nicht?
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3429
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat von Sir Rufo
Probier es einfach mal aus
Das habe ich gemacht. Allerdings glaube ich, dass ich die Frage immer noch missverstehe.

Tatsche ist, das Binding für den angezeigten Text in den Combobox-Items läuft über die Elemente der ItemsSource und den DisplayMemberName.
Das Binding für den Text, der in der (zugeklappten) Combobox angezeigt wird, kommt über das ViewModel. In diese gebundene Property geht auch der Text, den man in die Combo tippt.

Das funktioniert auch alles wie ich mir das vorgestellt habe. Ändert man die Property im MainViewModel z.B. über einen Task, wird das auch richtig angezeigt. Ändert amn den Wert in einem gebundenen Item, wird diese ebenfalls korrekt aktualisiert (wenn das Item INPC implementiert).

Zwischen beiden Werten besteht bezügl. des Bindings erst mal keine Kopplung, will man eine haben, muss man sie implemetieren.

@_Cashisclay
Ich glaube, der Knackpunkt liegt aber ganz woanders:
Wenn man Text in die Combo tippt, wird die Source aktualisiert - während dieser Aktualisierung ist aber die Gegenrichtung - View aktualisieren aus der Source - für dieses Element unterdrückt. Eine Änderung des getippten Textes ist auf die Art nicht möglich - dazu brauchst Du dann sowas wie von Sir Rufo vorgeschlagen.

Falls das noch nicht hilft:
Damit wir hier nicht alle aneinander vorbeireden, solltest Du nochmal genau beschreiben, was Du vorhast.
Aus Deinem ersten Post:
Zitat
If Not IsDBNull(DataRow.Item("Lieferschein")) Then ViewModel.Lieferschein_Text = DataRow.Item("Lieferschein")
Wann und durch welche Aktion wird dieser Code denn ausgeführt?
Wann wird Lieferschein_Text noch geändert, und durch welche Benutzeraktion?
Was stellst Du Dir als Ergebnis vor, und was passiert stattdessen?
Kannst Du das versuchen möglichst genau zu beschreiben, denn bisher ist das (zumindest für mich) immer noch etwas undurchsichtig.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

@_Cashisclay
Also bei meinem Beispiel passiert eigentlich genau das was du mMn gewünscht hast:

Tippt man in die ComboBox A ein dann erscheint dort ein B.

FullQuotes sind hier nicht gern gesehen, weil sie auch keinen wirklichen Sinn ergeben
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Deaktiviertes Profil am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

@Sir Rufo : Es ist kein FullQuote, habe einige deiner Zeilen gelöscht, die mMn nicht relevant waren.. In jedem Fall muss ich ja irgendwas falsch machen, weil bei mir funktioniert es nicht..

@MarsStein :

Ich habe vor den Inhalt von Text Property der ComboBox zu ändern :
Bedeutet wenn der User (Beispiel) A eintippt möchte ich daraus automatisch ein B machen.

If Not IsDBNull(DataRow.Item("Lieferschein")) Then ViewModel.Lieferschein_Text = DataRow.Item("Lieferschein")

Diese Zeile stammte aus dem PropertyChanged Event ..

Beispiel :
Select Case e.PropertyName

Case "Lieferschein_Text"

IF ViewModel.Lieferschein_Text = "A" THEN

ViewModel.Lieferschein_Text = "B"

END IF

Wie man das lösen könnte, kam ja bereits von Sir Rufo, allerdings krieg ich es in VB.NET noch nicht hin
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Was konkret bekommst du denn nicht hin?

Du hast nur das ViewModel geändert, dann hätte im Quote auch nur das ViewModel gereicht. So sieht man den Wald vor lauter Bäumen nicht.

Und wenn man etwas ändert, dann ist es auch kein Zitat (Quote) mehr.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Deaktiviertes Profil am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Deinen Quellcode quasi in VB.net zu übertragen, weil wenn ich eine Eingabe in der Combobox tätige er nicht mal in das TextInterception springt..
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Eine Suche bei Tante G nach c# to vb.net ergibt als ersten Treffer

Telerik: Code Converter
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Deaktiviertes Profil am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Das kannst du aber nicht 1 zu 1 so übernehmen, außerdem hab ich Codeschnipsel die mir nicht bekannt vor kamen damit schon übersetzt, wie gesagt es funktioniert ja nicht.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Denke mal im ViewModel hab ich irgendwas falsch gemacht
Public Class ComboBoxTry

    Public Interface ITextInterception

        Function ShouldChangedText(value As String, newValue As String) As Boolean

    End Interface

    Public Shared ReadOnly TextInterceptionProperty As DependencyProperty = DependencyProperty.RegisterAttached("TextInterception", GetType(ITextInterception), GetType(ComboBoxTry),
                                                                                                     New FrameworkPropertyMetadata(Nothing,
                                                                                                                                   New PropertyChangedCallback(AddressOf ComboBox_TextChanged)))

    Public Shared Sub SetTextInterception(obj As ComboBox, value As ITextInterception)

        obj.SetValue(TextInterceptionProperty, value)

    End Sub

    Public Shared Function GetTextInterception(obj As ComboBox) As ITextInterception

        Return TryCast(obj.GetValue(TextInterceptionProperty), ITextInterception)

    End Function

    Private Shared Sub ComboBox_TextChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)

        Dim ComboBox As ComboBox = d

        If ComboBox.Text = "C" Then

            AddHandler ComboBox.PreviewTextInput, AddressOf ComboBox_PreviewTextInput

        End If

    End Sub

    Private Shared Sub ComboBox_PreviewTextInput(sender As Object, e As TextCompositionEventArgs)



    End Sub

End Class
Imports WpfApplication2.ComboBoxTry

Public Class ViewModel

    Implements System.ComponentModel.INotifyPropertyChanged

    Sub New()

        Dim TextInterception As New TextInterceptionImpl

    End Sub




    Class TextInterceptionImpl

        Implements ITextInterception

        Public Function ShouldChangedText(value As String, newValue As String) As Boolean Implements ComboBoxTry.ITextInterception.ShouldChangedText

            If value = "A" Then

                newValue = "B"

                Return True

            End If

            newValue = String.Empty

            Return False

        End Function

    End Class

    Private _TextInterception As ITextInterception

    Public Property TextInterception As ITextInterception
        Get
            Return _TextInterception
        End Get
        Set(value As ITextInterception)
            _TextInterception = value
            PropertyChange("TextInterception")
        End Set
    End Property

    Private _Lieferschein_Text

    Public Property Lieferschein_Text As String
        Get
            Return _Lieferschein_Text
        End Get
        Set(value As String)
            _Lieferschein_Text = value
            PropertyChange("Lieferschein_Text")
        End Set
    End Property


#Region "Interface"
    Private Sub PropertyChange(ByVal Name As String)
        RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(Name))
    End Sub

    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
#End Region

End Class
<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication2"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        
        <ComboBox local:ComboBoxTry.TextInterception="{Binding TextInterception}" Text="{Binding Lieferschein_Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEditable="True"/>
        
    </Grid>
</Window>

EDIT: hab jetzt nicht versucht die Variable direkt zu beeinflussen, hab erstmal nur versucht mit Breakpoints zu gucken ob er in die Funktionen reinspringt
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 695
Herkunft: OWL

beantworten | zitieren | melden

ComboBox_PreviewTextInput ist bei dir leer.
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Ich weiß, aber das sollte ja nicht daran stören in die Funktion zu springen und das macht er eben erst gar nicht :/

mMn springt er nicht mal in die ComboBox_TextChanged, weil local:ComboBoxTry.TextInterception="{Binding TextInterception}" überhaupt kein Bezug hat zur Text Property
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Deine ComboBoxTry Klasse ist falsch.

Du musst dich am Event ComboBox.PreviewTextInput registrieren/abmelden und zwar immer dann, wenn sich die AttachedProperty ändert.

Pseudo-Code
OldValue == null && NewValue != null => Subscribe event
OldValue != null && NewValue == null => Unsubscribe event

Du hängst dich an den Event, wenn in ComboBox.Text ein D steht.

Steht da also kein D warum denkst du sollte dort etwas passieren?
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Er kommt ja nicht mal in das ComboBox_TextChanged Event.. ich kann mich so oder so nicht aktuell mit dem ComboBox_PreviewTextInput Event auseinandersetzen :O
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Okay hab es endlich hinbekommen ..

Danke für das Beispiel Sir Rufo!

Endlich ein Erfolgserlebnis nach 3 Tagen .. sorry wenn ich manchmal ein wenig seltsam geantwortet habe, aber mittlerweile hatte ich echt schlechte Laune wegen dem ganzen, ich versuch das ganze jetzt nachzuvollziehen, dann bastel ich das auf mein Projekt um und teile das Ergebnis nochmal für alle in VB.NET ..

Danke nochmal für das Beispiel.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von _Cashisclay am .
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

Themenstarter:

beantworten | zitieren | melden

Servus Sir Rufo,

ich bastel momentan noch mit dem Attached Property.. allerdings brauch ich einige Variablen aus meinem ViewModel und als ich dann ein wenig rumprobiert habe.. kam irgendwann die Frage in mir auf, warum man nicht einfach gleich das PreviewTextInput Event von der ComboBox nutzt, wäre doch wesentlich einfacher oder? :D

Grüße
private Nachricht | Beiträge des Benutzers