Laden...

OnPropertyChanged-Problem: Textbox wird nicht geupdated

Erstellt von Scholly vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.850 Views
S
Scholly Themenstarter:in
19 Beiträge seit 2013
vor 11 Jahren
OnPropertyChanged-Problem: Textbox wird nicht geupdated

Hallo,

ich habe eine Datenbank an eine Listbox gebunden. Wenn ich auf einen der Einträge klicke, dann soll dieser Eintrag in einer Textbox erscheinen. Das OnPropertyChanged-Event funktioniert, jedoch bleibt die Textbox die ganze Zeit leer. Weiß Jemand Rat?

Hier der Code:

<Window x:Class="MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:MVVM"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <ListBox Name="lstbx" ItemsSource="{Binding}" DisplayMemberPath="NAME" SelectedValuePath="NAME" SelectionChanged="lstbx_Selectionchanged"></ListBox>
        <TextBox Name="txtOben" Height="50" FontSize="16" Text="{Binding Path=SelectedKunde}"></TextBox>
    </StackPanel>
</Window>

Code behind:

namespace MVVM
{
    partial class MainWindow : Window, INotifyPropertyChanged
    {
        private DBCommunicator DBC = new DBCommunicator("c:/test.fdb");
        private DataTable Kundendatenbank = new DataTable();

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler tempHandler = PropertyChanged;
            if (tempHandler != null)
                tempHandler(this, new PropertyChangedEventArgs(name));
        }

        protected void OnPropertyChanged(MethodBase methodBase)
        {
            OnPropertyChanged(methodBase.Name.Substring(4));
        }

        object _selectedkunde;
        public object SelectedKunde
        {
            get { return _selectedkunde; }
            set
            {
                _selectedkunde = value;
                OnPropertyChanged(MethodInfo.GetCurrentMethod());
            }
        }

        public MainWindow()
        {
            Kundendatenbank = DBC.GetFullTable("Kunden");
            InitializeComponent();
            lstbx.ItemsSource = Kundendatenbank.DefaultView;
        }

        private void lstbx_Selectionchanged(object sender, EventArgs e)
        {
            SelectedKunde = (lstbx.SelectedValue.ToString());
        }
    }
}
849 Beiträge seit 2006
vor 11 Jahren

Hallo,

ich sehe in deinem Code mehrere Binding Fehler.

Das Binding der ListBox ist falsch. Aber das überschreibst Du dann ja wieder im ctor.

Das deine TextBox nichts anzeigt, ist dem geschuldet das Du nirgendwo sagst, das dein Control auch gleichzeitig DataContext ist.

ein


DataContext = this;

im ctor sollte zumindest die TextBox zum Leben erwecken.

Grüße

edit.. Sehe gerade deinen Namespace MVVM.. Entweder solltest Du den Namespace oder die vorgehensweise ändern. Denn mit MVVM hat das hier wenig zu tun.

S
Scholly Themenstarter:in
19 Beiträge seit 2013
vor 11 Jahren

Halölo,

Danke für den Tipp. Jetzt funktioniert es.
Wie Du richtig bemerkt hast, bin ich ein (blutiger) Anfänger und habe mich auch schon durch etliche Tutorials gekämpft. Mache also gerade die ersten Schritte.

Sag mir doch bitte wie die Bindings Deiner Meinung nach gesetzt werden müssen damit es wirkliches MVVM ist.

Danke im Voraus

2.298 Beiträge seit 2010
vor 11 Jahren

Mit den Bindungen hat das Grundlegend erstmal nichts zu tun, deinen Code in Richtung MVVM zu pressen.

Im Optimalfall ist die Codebehind der View dumm, maximal wird dort das ViewModel also quasi der DataContext des Window gesetzt.

Deine Eigenschaften SelectedKunde etc. gehören dann in das ViewModel. Wenn du mit Frameworks arbeitest wie z.B. Caliburn kommst du garnicht in die Versuchung Code im Codebehind der View zu schreiben.

Bei Caliburn Beispielsweise schreibst du nur die View (XAML) und setzt die Bindings, dabei vorrausgesetzt, das du nur Daten / SubViewModels bindest, die das ViewModel dann auch kennt.

Anbei noch ein Link zu Caliburn und einer zu einer Übersicht weiterer Frameworks.

Caliburn
Übersicht MVVM Frameworks

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

5.658 Beiträge seit 2006
vor 11 Jahren

Hi Scholly,

Sag mir doch bitte wie die Bindings Deiner Meinung nach gesetzt werden müssen damit es wirkliches MVVM ist.

Es geht nicht um die Bindings, sondern um den Aufbau deiner Klasse(n). MVVM heißt Model - ViewModel - View. Bei dir gibt es aber nur die View, nämlich das MainWindow. Was du brauchst, ist zunächst einmal ein Model, also eine Klasse, die die Daten beinhaltet, die du aus der Datenbank liest und bearbeiten möchtest. Das Model kannst du aber auch nicht direkt an die View binden, weil es keinen Benachrichtigungsmechanismus hat. Deshalb wird zwischen Model und View das ViewModel geschaltet, welches das INotifyPropertyChanged-Interface implementiert. Dann kannst du das ViewModel an die View binden, wodurch die View über geänderte Daten benachrichtigt wird, und das ViewModel die Änderungen an das Model weitergibt. Ausführliche Anleitungen und Beispiele dafür findest du aber auch bei Google.

Christian

Weeks of programming can save you hours of planning

241 Beiträge seit 2010
vor 11 Jahren

Es ist ja schön und gut direkt ein fertiges MVVM Framework zu verlinken, aber ist es für ihn besonders der Verständnis halber es nicht besser ihn das "dahinter" Kennenlernen zu lassen? Auch wenn es vllt. mehr Aufwand ist etwas selbst zu schaffen so würde ich dies wenn nicht gerade Auftrags bedingt anders Vorgegeben immer die bessere alternative - besonders wenn es gerade erlernt wird.

Ich hatte es gerade schon einmal irgendwo gepostet, ich würde dir das hier zum Einstieg empfehlen: http://msdn.microsoft.com/de-de/magazine/dd419663.aspx anschließend können sicherlich auch erste richtige Gehversuche ohne Hilfen von Fertig-Frameworks gemacht werden. 😃

Ansonsten stand noch folgendes als google Stichpunkte bereits im anderen Thread: ICommand, INotifyPropertyChanged, IValueConverter (aber nicht die Aufgaben des ViewModel's vernachlässigen!), Bindings und natürlich dürfen die Tests nicht fehlen, wobei letzteres eher TestDriven-Development ist als MVVM. 😃

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

5.299 Beiträge seit 2008
vor 11 Jahren

Die DAtaRows eines typisierten Datasets haben sehr wohl einen BenachrichtigungsMechanismus.

typDataset hat im Zusammenhang mit Wpf annere Einschränkungen, daher verwende ichs wenig, und hab nur ein Wpf-Dataset-Beispiel, wo grad der Benachrichtigungsmechanismus "INotifyPropertyChanged" garnet genutzt wird:
DelegateConverter

Der frühe Apfel fängt den Wurm.