2017-02-13 2 views
0

Пусть это базовый класссумма фильтрованной ICollectionView

public class Contrat_Paye_Item 
    { 
     public int  CPI_TYPE { get; set; } 
     public string CPI_TEXT { get; set; } 
     public decimal CPI_AMOUNT { get; set; } 
    } 

на мой взгляд модели я сделал список из этого класса, как это:

private ObservableCollection<Contrat_Paye_Item> listapayer; 
public ObservableCollection<Contrat_Paye_Item> ListaPayer 
{ 
    get 
    { 
     return listapayer; 
    } 
    set 
    { 
     listapayer = value; 
     OnPropertyChanged("ListaPayer"); 
    } 
} 

и в конструкторе VM, только некоторые Testdata:

listapayer.Add(new Contrat_Paye_Item() 
        { 
         CPI_TYPE = 0, 
         CPI_TEXT = "Loyer", 
         CPI_AMOUNT = 100 
        }); 


listapayer.Add(new Contrat_Paye_Item() 
        { 
         CPI_TYPE = 1, 
         CPI_TEXT = "charge 1", 
         CPI_AMOUNT = 200 
        }); 

listapayer.Add(new Contrat_Paye_Item() 
        { 
         CPI_TYPE = 1, 
         CPI_TEXT = "Charges 2", 
         CPI_AMOUNT = 300 
        }); 

поэтому полный список содержит 3 пункта общая сумма составляет 600.

в моем ViewModel я добавил подсписок только предметы, которые их CPI_type = 1 и связаны его в ListBox без проблем, как это:

public ICollectionView ListCharges 
     { 
      get 
      { 


       var sub= new CollectionViewSource { Source = listapayer }.View; 
       sub.Filter = p => (p as Contrat_Paye_Item).CPI_TYPE == 1; 
       return sub; 
      } 
     } 

теперь, что я хочу, чтобы отобразить список моих предметов , с строкой, содержащей сумма сумм элементов подсписок. безвыходном его второй ListBox

что-то вроде:

LOYER 100

плата 500

любая идея, наконечник приветствуется. благодаря

ответ

0

Как насчет добавить что-то вроде этого, прежде чем вернуться к югу:

 var d1 = (from a in sub.SourceCollection.OfType<Contrat_Paye_Item>() where a.CPI_TEXT == "Loyer" select a.CPI_AMOUNT).Sum(); 
     var d2 = (from a in sub.SourceCollection.OfType<Contrat_Paye_Item>() where a.CPI_TEXT.ToLower().StartsWith("charge") select a.CPI_AMOUNT).Sum(); 

     sub.AddNewItem(new Contrat_Paye_Item() { CPI_TEXT="Sum Loyer", CPI_AMOUNT = d1}); 
     sub.CommitNew(); 
     sub.AddNewItem(new Contrat_Paye_Item() { CPI_TEXT = "Sum Charges", CPI_AMOUNT = d2 }); 
     sub.CommitNew(); 

// Редактировать

Примечание это как более гибкой возможности:

Не используйте _CollectionViewSource _. Вместо того, чтобы использовать следующее как ItemsSource из ListBox:

 public ObservableCollection<Contrat_Paye_Item> ListCharges 
    { 
     get 
     { 
      return new ObservableCollection<Contrat_Paye_Item>((from a in listapayer where a.CPI_TYPE == 1 select a)); 
     } 
    } 
+0

спасибо человеку, это будет работать в моем сценарии, так как у меня есть только очень небольшие записи, поэтому воссоздавать список сумма не является проблемой для меня. Я отмечаю это как решение на данный момент, но :) – user2475096

+0

было бы неплохо, если бы он использовал наблюдаемый шаблон, Я не упоминал об этом для ясности кода, но на самом деле я использую шаблон INotifyPropertyChanged как для классов, так и для List. ObserableCollection является модифицированным One named NotifyPropertyChanged из этого потока http://stackoverflow.com/questions/8490533/notify-observablecollection-when-item-changes , который также позволяет уведомлять об изменениях элементов, поэтому мы можем обновлять сводки и такие вещи, как – user2475096

+0

, поэтому решение, использующее INotifyPropertyChanged и CollectionChanged, будет намного полезнее. и намек на это было бы здорово. ps: есть ли способ опубликовать длинный текст и коды в комментариях? поэтому wierd: p – user2475096