WPF

2016-04-12 19 views
0

'da ListView'e öğeler dinamik olarak nasıl eklenir ListView'da veri eklediğimde sorun yaşıyorum. Sorun, ListView'un verileri ilk kez doğru bir şekilde eklemesidir, ancak ikinci zaman verisi eklendiğinde, önceki satırı yeni verilerle değiştirir. İşte benim liste görünümü XAML ve XAMl.csWPF

<ListView HorizontalAlignment="Left" Name="invoiceLV" Height="207" Margin="154,88,-752,0" VerticalAlignment="Top" Width="914"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Code" DisplayMemberBinding="{Binding ProductCode}" Width="150" /> 
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding ProductName }" Width="150 " /> 
      <GridViewColumn Header=" Units" DisplayMemberBinding="{Binding Unit}" Width="150" /> 
      <GridViewColumn Header=" Unit Price" DisplayMemberBinding="{Binding UnitPrice}" Width="120" /> 
      <GridViewColumn Header=" Size(gm)" DisplayMemberBinding="{Binding Size}" Width="120" /> 
      <GridViewColumn Header=" GST %" DisplayMemberBinding="{Binding GST}" Width="100" /> 
      <GridViewColumn Header=" Price" DisplayMemberBinding="{Binding Price}" Width="120" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

public partial class Invoice : UserControl 
{ 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     inv.calculation(); 
     invoiceLV.Items.Add(inv); 
    } 
} 

Ve Bağlama sınıftır:

class Invoice : INotifyPropertyChanged 
{ 
    string productcode; 
    string productname; 
    double unitprice; 
    int size; 
    double gst; 
    double price; 
    string code; 
    string name; 
    int unit; 

    public double Price 
    { 
     get { return price; } 
     set 
     { 
      if (price != value) 
      { 
       price = value; 
       OnPropertyChanged("Price"); 
      } 
     } 
    } 

    public double GST 
    { 
     get { return gst; } 
     set 
     { 
      if (gst != value) 
      { 
       gst = value; 
       OnPropertyChanged("GST"); 
      } 
     } 
    } 

    public int Size 
    { 
     get { return size; } 
     set 
     { 
      if (size != value) 
      { 
       size = value; 
       OnPropertyChanged("Size"); 
      } 
     } 
    } 

    public double UnitPrice 
    { 
     get { return unitprice; } 
     set 
     { 
      if (unitprice != value) 
      { 
       unitprice = value; 
       OnPropertyChanged("UnitPrice"); 
      } 
     } 
    } 

    public string ProductName 
    { 
     get { return productname; } 
     set 
     { 
      if (productname != value) 
      { 
       productname = value; 
       OnPropertyChanged("ProductName"); 
      } 
     } 
    } 

    public string ProductCode 
    { 
     get { return productcode; } 
     set 
     { 
      if (productcode != value) 
      { 
       productcode = value; 
       OnPropertyChanged("ProductCode"); 
      } 
     } 
    } 

    public string Code 
    { 
     get { return code; } 
     set 
     { 
      if (code != value) 
      { 
       code = value; 
       OnPropertyChanged("Code"); 
      } 
     } 
    } 

    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
       name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 
    } 

    public int Unit 
    { 
     get { return unit; } 
     set 
     { 
      if (unit!= value) 
      { 
       unit= value; 
       OnPropertyChanged("Unit"); 
      } 
     } 
    } 

    public void calculation() 
    { 
     Bussiness.Invoice i = new Bussiness.Invoice(); 
     ProductName = i.Name(this); 
     ProductCode = code; 
     Unit = Unit; 
     UnitPrice = i.Unit(this); 
     GST = 18; 
     Size = i.Size(this); 
     Price =unit* (UnitPrice + (UnitPrice * (GST/100))); 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string PropertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } 

} 

}

Ve ekran görüntüleri aşağıda verilmiştir. İki kayıtları

sonra

Görüntü rekor bir sonraki

Image after one record

Görüntü [image after two records2

cevap

4

İdeal MVVM öğrenmek ve liste görünümü koleksiyonunuzu bağlamak gerekir. Ancak bu sorunu çözmek için, tekrar eklenecek Invoice aynı örneğini kullanıyorsunuz. Yeni örnek oluştur ve ekle. Düğmeye farklı değerle inv aynı örneğini değiştiriyorsanız vurmak her çünkü

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var inv = new Invoice(); 
    inv.calculation(); 
    invoiceLV.Items.Add(inv); 


} 
+0

Yardım #Nitin thanx yardım için. ama yine de aynı sorunla karşı karşıyayım :( – maadi

+0

tamam sonunda çözdüm. Yeni örnek oluşturulduktan sonra veriyi tekrar bağlamak zorundayım. Yukarıdaki kodda olduğu gibi bu satırın eklenmesi gerekir. DataContext = inv; – maadi

2

öyle. Bunu yapmanın MVVM yolu, ürün kaynağını ayarlamak ve bir koleksiyona bağlamaktır.

ObservableCollection<Invoice> _yourItemSource= new ObservableCollection<Invoice>(); 
invoiceLV.ItemsSource = _yourItemSource; 


    private void Button_Click(object sender, RoutedEventArgs e) 
    { 

     var inv = new Invoice(); 
     inv.calculation(); 
     _yourItemSource.Add(inv); 

    } 
+0

heyy Kayle .. Kurucuda ya da düğmenin arkasında "_yourItemSource" yaratıyorum? – maadi

+0

bu da benim durumumda çalışmıyor :( – maadi

0
private void Button_Click(object sender, RoutedEventArgs e) 
{ 
     var invoice = new Invoice(); 
     invoice.calculation(); 
     invoiceLV.Items.Add(invoice); 
    //Add items to your listview by above code! 
} 

Ayrıca aynı şekilde veri bağlayabilir!