2016-07-12 11 views
0

Ich habe in letzter Zeit bei der Verwendung von WPF und Databinding gelernt, es ist gute Praxis, keine der Felder zu benennen, sondern nur mit den Eigenschaften in den anderen Klassen zu verknüpfen. Mein Problem ist jetzt, wie füge ich die Daten aus 3 Textboxen hinzu (der Benutzer gibt ein), speichere die verknüpften Informationen in dem Modell, das dann die Kontoinformationen in die Listbox auf der Seite schreibt. Ich muss die Daten meinem Modell hinzufügen. Mein Code von main.xaml ist unten:Datenbindung mit unbenannten Textfeldern und Listbox

<ListBox ItemsSource="{Binding Path=Files}" SelectedItem="{BindingPath=CurrentItem}" /> 

    <TextBox Text="{Binding Path=bankaccount}"/> 
    <TextBox Text="{Binding Path=accountnumber}"/> 
    <TextBox Text="{Binding Path=accounttype}"/> 
    <Button Content="Save Data To Listbox" Click="Save_Click"/> 

Jetzt werde ich meine FileModel Klasse zeigen, die alle meine Eigenschaften besitzt, die aus den Textfeldern

 private short _BankAccount; 
     private long _AccountNumber; 
     private char _AccountType; 

     public short bankaccount{ get { return _BankAccount;} set {_BankAccount= value; Notify("bankaccount"); } } 
     public long accountnumber{ get { return _AccountNumber;} set {_AccountNumber= value; Notify("accountnumber"); } } 
     public char accounttype{ get { return _AccountType;} set{_AccountType= value; Notify("accounttype"); } } 

ich eine Klasse verwenden genannt ProgramModel sein wird, wie mein Mittelpunkt zwischen der Startseite und meine FileModel Seite und hier ist der Code:

public class ProgramModel : INotifyPropertyChanged 
{ 

    public ObservableCollection<FileModel> Files { get; set; } 

    private FileModel _currentItem; 
    public FileModel CurrentItem { get { return _currentItem; } set { _currentItem = value; Notify("CurrentItem"); } } 


    public ProgramModel() 
    { 
     Files = new ObservableCollection<FileModel>(); 
    } 

und zum Schluss habe ich meine Startseite:

Ich fühle mich, als würde ich die Dateisammlung fälschlicherweise aus dem Speichern Schaltfläche Ereignis hinzufügen. Wenn ihr mir helfen könnt, wäre das großartig! Alle 3 Textfelder und das Listenfeld befinden sich auf der Hauptseite. Lass es mich wissen, wenn du irgendwelche Fragen hast. Außerdem ist dies eine Lernerfahrung, also lass es mich wissen, wenn ich zu viel Code gepostet habe oder nicht genug. Vielen Dank!

+0

Eigenschaften wie 'bankaccount' sollten PascalCased sein. –

Antwort

3

Sie lesen die Werte von einer neuen FileModel Instanz statt von dem, was an die Ansicht gebunden ist.

Model.Files.Add(new FileModel 
(
    Model.CurrentItem.bankaccount, 
    Model.CurrentItem.accountnumber, 
    Model.CurrentItem.accounttype 
)); 

Stellen Sie sicher, CurrentItem tatsächlich mit einer Instanz initialisiert wird, sehen, dass nicht in Ihrem Code: Code sollte dies sein. Sie können hier auch einen Befehl verwenden und die gesamte relevante Logik in Ihrem gebundenen Ansichtsmodell haben, ohne dass das Ereignis erforderlich ist.

Außerdem binden Sie jetzt das aktuelle Element an das ausgewählte Element in der ListBox, das wird stattdessen eine vorhandene Instanz ändern. Nicht sicher, ob dies beabsichtigt ist. Wenn Sie möchten, dass diese Felder für die Eingabe neuer Instanzen verwendet werden, binden Sie die ListBox nicht an sie.

+0

H.B. Kannst du weiter erklären, wie das CurrentItem mit einer Instanz initialisiert wird und wie ich das formatieren würde? Da bekomme ich die Fehlermeldung "Objektreferenz nicht auf eine Instanz des Objekts festgelegt" – ssapp119

+0

Ordnen Sie im Konstruktor des Ansichtsmodells, wie Sie mit Dateien getan haben, eine neue Instanz zu "CurrentItem". –

+0

Es hat funktioniert! Danke HAB! – ssapp119

0

Ich werde Ihre Frage nicht direkt beantworten, da die Implementierung einer ordnungsgemäßen Datenbindung ein wenig Code erfordert.

Mit der richtigen Datenbindung ist es möglich, fast keinen Code auf Ihrer view.cs! (Vor allem, wenn Sie mit der Verwendung von Frameworks beginnen)

Bitte beachten Sie A Simple MVVM Example für Sie, gute Praxis zu folgen.

Anhand dieses Beispiels sehen Sie, dass Sie auch Datenbindung für Schaltflächen und andere Steuerelemente verwenden können.

Ihr View-Modell, das ProgramModel : INotifyPropertyChanged ist, sollte die ganze Arbeit (Datenverarbeitung) behandeln.

Ihr Modell sollte die UI-Update-Benachrichtigungen damit nicht umgehen,

public short bankaccount{ get { return _BankAccount;} set {_BankAccount= value; Notify("bankaccount"); } } 

wird das ProgramModel (Ansicht Modell) bewegt werden.

Save_Click Methode wird auch in eine ICommand umgewandelt werden und wie <Button Content="Save Data To Listbox" Command="{Binding SaveExec}"/>

in Hinblick auf die Schaltfläche binded werden Der Punkt ist, wenn Sie die Datenbindung studieren, sollten Sie es richtig umzusetzen. Hoffe, dass Sie verstehen ...

Am Ende ist es möglich, für Ihre Main.cs nur sein ..

internal partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = new ProgramModel(); 
    } 
} 
0

Nur eine kleine Änderung und es sollte funktionieren. Ändern Sie Ihre Bindungen wie unten für die TextBoxen gezeigt.

<TextBox Text="{Binding Path=CurrentItem.bankaccount}"/> 

<TextBox Text="{Binding Path=CurrentItem.accountnumber}"/> 

<TextBox Text="{Binding Path=CurrentItem.accounttype}"/>