2016-08-23 1 views
0

Ich habe eine Crew-Eigenschaft, die Eigenschaft hat mehrere Felder, von denen einige Code und InvoiceAmount sind. Der Plus-Button soll eine neue Crew in eine ObservableCollection von Crews einfügen. Das Hinzufügen des ersten Elements funktioniert einwandfrei. Wenn jedoch das zweite Element eingefügt wird, ändert sich der Code des ersten Elements in das zweite Element und das zweite Element enthält keinen sichtbaren Code. Wie repariere ich es, so dass jedes Mal, wenn ich auf die + Schaltfläche klicke, eine neue Crew eingefügt wird?XAML gebundene Eigenschaft funktioniert nicht wie erwartet

Start UI:

enter image description here

Nach einem Punkt (a) wird hinzugefügt:

enter image description here

Zweites Element (b) hinzugefügt:

enter image description here

Hier ist der Viewmodel Code:

public class MainPageViewModel : ViewModelBase 
{ 
    public MainPageViewModel() 
    { 
     AddCrewCommand = new CustomCommand(param => addCrew(), null); 
     Crews.CollectionChanged += new NotifyCollectionChangedEventHandler(Crews_Updated); 
    } 

    private void Crews_Updated(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     RaisePropertyChanged("lvCrewList"); 
    } 

    public Crew Crew { get; set; } = new Crew(); 

    public ObservableCollection<Crew> Crews { get; private set; } = new ObservableCollection<Crew>(); 

    public Crew SelectedCrew { get; set; } 

    public ICommand AddCrewCommand { get; private set; } 

    private void addCrew() 
    { 
     Crews.Add(Crew); 
     Crew = new Crew(); 
    } 

    public ObservableCollection<string> SelectedWorkOrder { get; set; } 
} 

ViewModelBase:

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Hier ist das XAML-Bit, das das Feld Code zuweist:

 <StackPanel Orientation="Horizontal" VerticalAlignment="Top" > 
      <Label Content="Crew" Width="55" Height="25" Margin="10,10,0,0"/> 
      <TextBox x:Name="txtCrew" Width="75" Height="25" Margin="0,10,10,0" 
       Text="{Binding Crew.Code, Mode=TwoWay}" /> 
      <Button Content="+" Width="25" Height="25" Margin="0, 10, 0, 0" Command="{Binding AddCrewCommand}" /> 
     </StackPanel> 

Besatzung Klasse:

public class Crew 
{ 
    public string Code { get; set; } 

    public decimal InvoiceAmount { get; set; } = 0; 

    public Job Job { get; set; } 

    public override string ToString() => Code; 
} 
+0

Können wir für das Gitter sehen verbindlich? –

Antwort

1

Es weil du nicht r bist Bei einem PropertyChanged Ereignis für Ihre Crew Eigenschaft ist die Textbox immer noch an die zuvor hinzugefügte Crew gebunden.

Ihre MainPageViewModel.Crew Eigenschaft auf die folgende Änderung:

public class MainPageViewModel : ViewModelBase 
{ 
    ............. 
    private Crew _crew = new Crew(); 
    public Crew Crew 
    { 
     get { return _crew; } 
     set 
     { 
      if (_crew == value) return; 
      _crew = value; 
      RaisePropertyChanged(nameof(Crew)); 
     } 
    } 
    ....... 
} 
Verwandte Themen