none
MVVM Binding RRS feed

  • Frage

  • Hallo!

    Ich habe einen Fehler im Binding eines DataModel, den ich mir nicht erklären kann :-(

    Ich habe ein TabControl mit einem ContentTemplate, in dem ich die Text-Eigenschaft einer TextBox an die Eigenschaft (SQL) eines DataModel binde:

    <TabControl ItemsSource="{Binding ViewTabellen}" IsSynchronizedWithCurrentItem="True" >
        <TabControl.ContentTemplate>
            <DataTemplate>
                <TextBox Text="{Binding SQL, Mode=TwoWay, Converter={StaticResource testconv}, UpdateSourceTrigger=PropertyChanged}" />
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
    
    
    

    Beim Initalisieren des DataModels, ordne ich der SQL-Eigenschaft (string) einen Wert zu. Dieser Wert wird beim Initialisieren des Fensters im TabItem angezeigt und auch die VS-Ausgabe zeigt kein Binding-Error:

    Zur Kontrolle des Bindings habe ich einen Test-Konverter in das Binding integriert. Auch dieser zeigt bei der Initialisierung des Fensters den Initalisierungswert:

    Sobald ich jetzt aber den Inhalt der TextBox (im Fenster) ändere, z.B. eine "2" anhänge, wird der Text gelöscht:

    Dieser Wert wird auch auf das DataModel übertragen.

    Kann mir das jemand erklären???

    Fred


    • Bearbeitet perlfred Montag, 18. Februar 2019 11:04
    Montag, 18. Februar 2019 11:01

Antworten

  • Hi Fred,
    mit "return null;" im "ConvertBack" wird in jedem Fall der Inhalt der gebundenen Eigenschaft mit null beschrieben, egal, was Du in der TextBox eingibst.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert perlfred Montag, 18. Februar 2019 13:49
    Montag, 18. Februar 2019 11:07
  • Hat sich erledigt!

    Binding mit UpdateSourceTrigger=PropertyChanged  muss man natürlich auch setzen, wenn man vor dem Verlassen der TextBox eine Aktualisierung bewirken will!

    Sorry!


    • Als Antwort markiert perlfred Montag, 18. Februar 2019 13:48
    • Bearbeitet perlfred Montag, 18. Februar 2019 13:50
    Montag, 18. Februar 2019 13:48

Alle Antworten

  • Hi Fred,
    mit "return null;" im "ConvertBack" wird in jedem Fall der Inhalt der gebundenen Eigenschaft mit null beschrieben, egal, was Du in der TextBox eingibst.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert perlfred Montag, 18. Februar 2019 13:49
    Montag, 18. Februar 2019 11:07
  • Hallo Peter!

    Ja, das war ein Lapsus :-( !  ConvertBack hatte ich gar nicht auf dem Schirm, da ich bis jetzt ganz wenig mit TwoWay-Binding gearbeitet habe.

    Den Konverter hatte ich eigentlich aber nur benutzt, da mein ursächliches Problem war/ist, dass das Model (trotz funktionierenden Binding) nicht aktualisiert wird!!!

    Ich habe den Converter jetzt so geändert, dass die ConvertBack-Methode den Text auch wieder nur zurück gibt :

    public class Test_Converter : IValueConverter
    {
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (string)value;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (string)value;
        }
    }

    und alles (Model und TextBox wird aktualisiert) funktioniert.

    Wenn ich das Binding jedoch ohne Konverter angebe, wird das Model nicht aktualisiert!

    <TextBox Text="{Binding SQL, Mode=TwoWay}" />

      

    Das funktionierende Binding müsste doch immer das Model aktualisieren?!






    • Bearbeitet perlfred Montag, 18. Februar 2019 13:35
    Montag, 18. Februar 2019 13:23
  • Hat sich erledigt!

    Binding mit UpdateSourceTrigger=PropertyChanged  muss man natürlich auch setzen, wenn man vor dem Verlassen der TextBox eine Aktualisierung bewirken will!

    Sorry!


    • Als Antwort markiert perlfred Montag, 18. Februar 2019 13:48
    • Bearbeitet perlfred Montag, 18. Februar 2019 13:50
    Montag, 18. Februar 2019 13:48
  • Hi Fred,
    mit Deinem MouseLeftButtonDown bewirkst Du kein EndEdit, d.h. keinen Übergang aus dem Edit-Modus in den Anzeige-Modus. Wenn kein PropertyChanged gesetzt wird, dann wird die Datenquelle (gebundene Eigenschaft) erst aktualisiert, wenn der Edit-Modus verlassen wird. Das war auch schon vor XAML in WindowsForms-Steuerelementen so (dort ein EndCurrentEdit vom CurrencyManager und der Aufruf des Parse-Ereignisses im Binding-Objekt, was funktionell dem ConvertBack im Converter entspricht).

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Montag, 18. Februar 2019 14:19
  • Hallo Peter!

    Danke!!!! für deine genaue Erklärung der Zusammenhänge!

    Montag, 18. Februar 2019 14:29