【问题标题】:sum of filtered ICollectionView过滤后的 ICollectionView 的总和
【发布时间】:2017-02-13 03:06:53
【问题描述】:

假设这个基类

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 构造函数中,只有一些测试数据:

 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。

在我的视图模型中,我添加了一个子列表,其中仅包含 CPI_TYPE = 1 的项目,并将其绑定到列表框,没有这样的问题:

   public ICollectionView ListCharges
        {
            get
            {


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

现在我要显示的是我的项目列表,其中一行包含子列表的 金额总和 项目。将其绑定到第二个列表框

类似:

100 号员工

收费 500

任何想法,欢迎提示。 谢谢

【问题讨论】:

    标签: wpf filtering observablecollection icollectionview


    【解决方案1】:

    在返回子之前添加这样的东西怎么样:

            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 _。而是使用以下内容作为 ListBox 的 ItemsSource:

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

    【讨论】:

    • 谢谢,这在我的场景中会起作用,因为我只有很少的记录,所以重新创建总和列表对我来说不是问题。我现在将此标记为解决方案,但是:)
    • 如果它使用 observable 模式会很好,为了代码清晰我没有提到这一点,但实际上我对类和列表都使用了 INotifyPropertyChanged 模式。 ObserableCollection 是从这个线程stackoverflow.com/questions/8490533/… 中修改的一个名为 NotifyPropertyChanged 的​​对象,它也允许通知项目更改,因此我们可以更新摘要和类似的内容
    • 所以使用 INotifyPropertyChanged 和 CollectionChanged 的​​解决方案会更有用。并暗示这一点会很棒。 ps:有没有办法在 cmets 中发布格式化的长文本和代码?好奇怪:p
    猜你喜欢
    • 2016-04-07
    • 2020-05-20
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多