如果我有一个像这样的Observable集合:

public ObservableCollection<SpecialPriceRow> SpecialPriceRows = new ObservableCollection<SpecialPriceRow>();


SpecialPriceRow类别:

public class SpecialPriceRow : INotifyPropertyChanged
{
    public enum ChangeStatus
    {
        Original,
        Added,
        ToDelete,
        Edited
    }

    public ChangeStatus Status { get; set; }
    public string PartNo { get; set; }

    private decimal _price;
    public decimal Price
    {
        get
        {
            return _price;
        }
        set
        {
            if (value != _price)
            {
                _price = value;
                Status = ChangeStatus.Edited;
                OnPropertyChanged("Status");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}


我是否可以将XAML中的Label绑定到说成...添加的对象数?所以我可以得到这样的东西:



绿色是集合中“已添加”对象的计数。我将如何做这样的事情?

最佳答案

我已经编写了一个ViewModel,它将执行您正在寻找的所需功能。

    class VM : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public ObservableCollection<SpecialPriceRow> _SpecialPriceRows = new ObservableCollection<SpecialPriceRow>();
        private int _Original = 0;
        private int _Added = 0;
        private int _ToDelete = 0;
        private int _Edited = 0;

        public VM()
        {
            PropertyChanged = new PropertyChangedEventHandler(VM_PropertyChanged);

            //The following lines in the constructor just initialize the SpecialPriceRows.
            //The important thing to take away from this is setting the PropertyChangedEventHandler to point to the UpdateStatuses() function.
            for (int i = 0; i < 12; i++)
            {
                SpecialPriceRow s = new SpecialPriceRow();
                s.PropertyChanged += new PropertyChangedEventHandler(SpecialPriceRow_PropertyChanged);
                SpecialPriceRows.Add(s);
            }
            for (int j = 0; j < 12; j+=2)
                SpecialPriceRows[j].Price = 20;
        }

        private void VM_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
        }

        private void SpecialPriceRow_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Status")
                UpdateStatuses();
        }

        public ObservableCollection<SpecialPriceRow> SpecialPriceRows
        {
            get
            {
                return _SpecialPriceRows;
            }
        }

        private void UpdateStatuses()
        {
            int original = 0, added = 0, todelete = 0, edited = 0;
            foreach (SpecialPriceRow SPR in SpecialPriceRows)
            {
                switch (SPR.Status)
                {
                    case SpecialPriceRow.ChangeStatus.Original:
                        original++;
                        break;
                    case SpecialPriceRow.ChangeStatus.Added:
                        added++;
                        break;
                    case SpecialPriceRow.ChangeStatus.ToDelete:
                        todelete++;
                        break;
                    case SpecialPriceRow.ChangeStatus.Edited:
                        edited++;
                        break;
                    default:
                        break;
                }
            }
            Original = original;
            Added = added;
            ToDelete = todelete;
            Edited = edited;
        }

        public int Original
        {
            get
            {
                return _Original;
            }
            set
            {
                _Original = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Original"));
            }
        }

        public int Added
        {
            get
            {
                return _Added;
            }
            set
            {
                _Added = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Added"));
            }
        }

        public int ToDelete
        {
            get
            {
                return _ToDelete;
            }
            set
            {
                _ToDelete = value;
                PropertyChanged(this, new PropertyChangedEventArgs("ToDelete"));
            }
        }

        public int Edited
        {
            get
            {
                return _Edited;
            }
            set
            {
                _Edited = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Edited"));
            }
        }
    }


注意构造函数中的注释。您需要将每个SpecialPriceRow的PropertyChanged事件指向UpdateStatuses函数,以使其正常工作。
现在,您需要做的就是将标签绑定到ViewModel中的适当属性。
如果您的SpecialPriceRows列表变得非常大,则可能需要考虑对状态计数进行一些不同的计算。当前,每次更新一个实例时,它都会遍历整个列表。为了更好地执行此操作,您可能希望将状态的旧值保留在SpecialPriceRow类中,并且每次进行更新时,增加新的状态数并减少旧的状态数。

09-11 19:52