2016-06-29 6 views
0

ModelleWie fügt man Textfeldwerte hinzu, die mit MVVM aufgelistet werden?

public class EmployeeDetails 
{ 
    public string Name { get; set; } 
    public int Age {get;set;} 
} 

public class AddressDetails 
{ 
    public EmployeeDetails EmployeeName { get; set; } 
    public string City { get; set; } 
} 

Ansicht

<Window x:Class="ClassCollection.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:ClassCollection" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" 
    DataContext="{Binding Source={StaticResource loc},Path=ViewModel}" 
    > 
<Grid> 
    <StackPanel Margin="0 20 0 0"> 
     <TextBox x:Name="txt1" Width="90" Height="20" Text="{Binding Details.EmployeeName}"/> 
     <TextBox x:Name="txt2" Width="90" Height="20" Text="{Binding Details.City}" Margin="0 20 0 0"/> 
    </StackPanel> 
    <Button x:Name="btn" Width="90" Height="25" Content="Add" Command=" {Binding AddCommand}"/> 
</Grid> 
</Window> 

Ansichtsmodell

public class Viewmodel 
{ 
    public ObservableCollection<AddressDetails> EmployeeList; 
    public Viewmodel() 
    { 
     EmployeeList = new ObservableCollection<AddressDetails>(); 
     LoadCommand(); 
    } 

    private AddressDetails _details; 
    public AddressDetails Details 
    { 
     get { return _details; } 
     set 
     { 
      _details = value; 
     } 
    } 

    // Commands 
    public ICommand AddCommand { get; set; } 

    private void LoadCommand() 
    { 
     AddCommand = new CustomCommand(Add, CanAdd); 
    } 

    private bool CanAdd(object obj) 
    { 
     return true; 
    } 

    private void Add(object obj) 
    { 
     EmployeeList.Add(new AddressDetails { EmployeeName = Details.EmployeeName, City = Details.City }); 
    } 
} 

Locator

public class Locator 
{ 
    private static Viewmodel viewmodel = new Viewmodel(); 
    public static Viewmodel ViewModel 
    { 
     get { return viewmodel; } 
    } 
} 

Wie TextBox v hinzufügen Wie wäre es mit einer Sammelliste mit MVVM?

Das obige ist mein Code, den ich ausprobiert habe. Es zeigt Null Referenz Ausnahme, wenn ich oben mag. Was wäre das Problem?

aktualisieren

Ich habe zwei Felder in EmployeeDetails Klasse. Also muss ich für diese zwei Felder Eingabe geben, wenn sie zur Sammlung hinzugefügt werden. Aber ich brauche nur ein Feld Name in die Sammlung einzufügen. Wie es geht?

+1

Verwenden Sie den Debugger, Code für Schritt durch. Dann können Sie sehen, welche spezifische Zeile die NullReferenceException auslöst. Wie für Ihren Code implementieren Sie INotifyPropertyChanged überall? Andernfalls wird Ihre View nicht über Änderungen an der Observable Collection benachrichtigt. – Fang

+0

Es scheint statt der 'Text = "{Binding Details.EmployeeName}"' Bindung die 'Text =" {Binding Details.EmployeeName.Name} "-Bindung zu verwenden. –

+0

Könnten Sie bitte den entsprechenden Code oder Pseudocode posten, um dies zu illustrieren: «Also muss ich die Eingabe für diese beiden Felder eingeben, wenn sie der Sammlung hinzugefügt werden. Aber ich brauche nur einen Feldnamen, um ihn in die Sammlung einzufügen. »? –

Antwort

1

Analyse

Es scheint, die _details Feld nicht «initialisiert» wird.

Lösung

Bitte beachten Sie das entsprechende Feld Initialisierung Einführung, zum Beispiel:

private readonly AddressDetails _details = new AddressDetails 
    { 
     EmployeeName = new EmployeeDetails() 
    }; 
+0

Funktioniert gut .. Danke @Sergey Brunov –

+0

Noch ein Zweifel. Wenn ich ein weiteres Feld (Name, Age) in der EmployeeDetails-Klasse habe und nur ein Feld (Name) in der AddressDetails-Klasse brauche, können wir constructor right ?? wenn ja dann, wie diese _details Eigenschaft zu initialisieren? –

+0

@ A.Manikandan, froh, dass es geholfen hat! Entschuldigung, ich habe die Frage nicht verstanden. Könnten Sie bitte die aktuelle Frage aktualisieren oder sie als separate Frage stellen? –

Verwandte Themen