Laden...

Gebundene Werte aus ViewModel werden nicht aktualisiert

Erstellt von Moechen vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.961 Views
M
Moechen Themenstarter:in
2 Beiträge seit 2016
vor 7 Jahren
Gebundene Werte aus ViewModel werden nicht aktualisiert

Guten Abend alle zusammen,

(Vorweg: Ich habe bis jetzt immer alles an Code in die CodeBehind-Daten geschrieben und mich bisher noch nicht mit folgendem beschäftigt.)

ich habe ein kleines Problem in einer kleinen Anwendung und hoffe einer von euch kann mir helfen.

Ich habe eine Klasse Benutzer:
In der Klasse habe ich nun erstmal nur Vor- und Nachname als Eigenschaft angelegt.

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace Benutzerverwaltung.Model
{
    public class Benutzer
    {
        private string _firstName;
        private string _lastName;

        public Benutzer(string firstName, string lastName)
        {
            if (string.IsNullOrWhiteSpace(firstName)) throw new ArgumentNullException("givenName");
            if (string.IsNullOrWhiteSpace(lastName)) throw new ArgumentNullException("sn");

            _firstName = firstName;
            _lastName = lastName;

            Console.WriteLine("Benutzer");
        }

        public string FirstName
        {
            set { _firstName = value;
                Console.WriteLine(_firstName);
            }
            get { return _firstName; }
        }

        public string LastName
        {
            set { _lastName = value;
                Console.WriteLine(_lastName);
            }
            get { return _lastName; }
        }
    }
}

ViewModel: In der vererbten Klasse hab ich das INotifyPropertyChanged Event erstellt, was auch funktioniert.
(Wenn ich eine neue Property im ViewModel erstelle und binde funktioniert es)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Benutzerverwaltung.Model;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace Benutzerverwaltung.ViewModel
{
    public class BenutzerViewModel : BaseViewModel
    {
        private Benutzer _benutzer;

        public BenutzerViewModel(Benutzer benutzer)
        {
            _benutzer = benutzer;
        }

        public BenutzerViewModel()
        { }

        public Benutzer Benutzer
        {
            set { _benutzer = value; }
            get { return _benutzer; }
        } 
    }
}

Dann hab ich ein UserControl:
Hier hab ich den DataContext auf mein ViewModel gesetzt und meine beiden TextBoxen darüber "gebunden"

<UserControl x:Class="Benutzerverwaltung.Views.StudentView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Benutzerverwaltung.Views"
             xmlns:viewModel="clr-namespace:Benutzerverwaltung.ViewModel"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.DataContext>
        <viewModel:BenutzerViewModel />
    </UserControl.DataContext>
    <Grid>
        <StackPanel HorizontalAlignment = "Left">
            <StackPanel Orientation = "Vertical">
                <TextBox Text = "{Binding Path=Benutzer.LastName}" Width = "100" Margin = "3 5 3 5"/>
                <TextBox Text = "{Binding Path=Benutzer.FirstName}" Width = "100" Margin = "3 5 3 5"/>
            </StackPanel>
        </StackPanel>
    </Grid>
</UserControl>

Ich möchte nun die Werte der TextBoxen über das ViewModel an das Model (Benutzer) senden. Leider funktioniert das so wie ich es aufgebaut habe nicht. Eine Fehlermeldung bekomme ich jedoch auch nicht.

Ich könnte natürlich für Vor- und Nachname im ViewModel eigene Setter/Getter erstellen, aber das sollte doch so auch funktionieren oder liege ich da falsch?
(Es sollen noch weitere Eigenschaften hinzukommen, sodass es mit den vielen Settern/Gettern unübersichtlich werden würde)

Ich hoffe ich hab das halbwegs gut beschrieben und jemand kannst mir helfen. Mit würde auch ein Suchbegriff reichen.

Viele grüße
Moechen

L
136 Beiträge seit 2015
vor 7 Jahren

Hallo Moechen,

Bei Deinen Properties im Model, sowie im ViewModel (Benutzer) INotifyPropertyChanged implementieren/aufrufen.



        public string FirstName
        {
            get { return _firstName; }
            set
            {
                if (Equals(_firstName, value)) return;
                _firstName = value;
                OnPropertyChanged();
            }
        }


Gruss Lhyn

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Moechen,

ViewModel: In der vererbten Klasse hab ich das INotifyPropertyChanged Event erstellt, was auch funktioniert.
(Wenn ich eine neue Property im ViewModel erstelle und binde funktioniert es)

Das INotifyPropertyChanged ist nicht dazu da, dass die Werte gebunden werden. Es dient dazu, dass Änderungen im Viewmodel an der View angezeigt werden.

Daher implementiere das INP und ruf es auf, wie lhyn schon sagte.

Gruss

Coffeebean

1.040 Beiträge seit 2007
vor 7 Jahren

Eine Fehlermeldung bekomme ich jedoch auch nicht.

Fehlermeldungen/Warnungen bzgl. XAML stehen meistens im Output. =)

W
872 Beiträge seit 2005
vor 7 Jahren

Ich würde Dir Fody/PorpertyChanged empfehlen. Das implementiert Dir das automatisch im Hintergrund und hält den Code kompakt.

D
985 Beiträge seit 2014
vor 7 Jahren

Man muss auch noch sagen, dass hier nicht die Werte aus dem ViewModel, sondern die Werte aus dem Model gebunden werden sollen.

Empfehlen würde ich das so nicht.

M
Moechen Themenstarter:in
2 Beiträge seit 2016
vor 7 Jahren

Hallo zusammen,

vielen Dank schonmal für eure Antworten.

Wenn das so, wie ich es probiert hatte nicht funktioniert, gibt es einen "besten weg" mit mehreren
TextBoxen umzugehen ohne für jede in dem ViewModel und Model einen Getter/Setter zu erstellen?

Das ich im Model einen brauche ist mir bewusst, aber auch im ViewModel?

VG
Moechen

16.842 Beiträge seit 2008
vor 7 Jahren

Das ViewModel repräsentiert Deine Ansicht.
Alles, was Du dort eingeben kannst oder dort dynamisch angezeigt werden soll, muss es im ViewModel auch geben.

Dein Model hat damit nichts zutun.
Dein Model spielt in der Ansicht keine Rolle und sollte dort gar nicht zu finden sein - nur das ViewModel.