2016-08-23 11 views
0

私はCrewプロパティを持っています。プロパティにはいくつかのフィールドがあり、そのほとんどはCodeとInvoiceAmountです。プラスボタンは、新しい乗組員をObservableCollection of crewsに挿入することになっています。最初の項目を追加すると問題はありませんが、2番目の項目が挿入されると、最初の項目のコードは2番目の項目に変更され、2番目の項目は表示されないコードになります。 +ボタンをクリックするたびに新しいクルーが挿入されるように修正するにはどうすればよいですか? UI開始XAMLバウンドプロパティが期待どおりに機能していません

enter image description here

を一つの項目(A)を添加した後:

enter image description here

2番目の項目(b)が追加されました:

enter image description here

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)); 
    } 
} 

ここCodeフィールドを割り当てXAMLビットがあります:

 <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> 

クルークラス:

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

は、我々はグリッドのバインディングを参照することはできますか? –

答えて

1

それここでのViewModelコードですあなたがrではないからですあなたのCrewプロパティのPropertyChangedイベントが発生するため、テキストボックスは以前に追加されたクルーにバインドされます。

以下にご MainPageViewModel.Crewプロパティを変更

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)); 
     } 
    } 
    ....... 
} 
関連する問題