2

私がその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のラベルをオブジェクトの数にバインドすることは可能でしょうか...追加されましたか?だから私はこのようなものを手に入れることができました:

ここに画像の説明を入力してください

ここで、緑色はコレクション内の「追加された」オブジェクトの数です。どうすればこのようなことをすることができますか?

4

2 に答える 2

0

探している機能を実行する 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 リストが非常に大きくなる場合は、ステータス カウントの計算方法を少し変えることを検討してください。現在、1 つのインスタンスが更新されるたびにリスト全体を反復処理しています。これをより適切に実行するには、SpecialPriceRow クラスのステータスの古い値を保持し、更新が発生するたびに、新しいステータス カウントをインクリメントし、古い値をデクリメントすることができます。

于 2013-02-03T01:58:13.477 に答える
0

これを行うための組み込み機能を認識していません。カウントを行い、これにバインドするカスタム プロパティをデータ コンテキスト クラスに作成します。

このようなもの:

public int AddedCount
{
    get
    {
        return SpecialPriceRows.Where(r => r.Status == ChangeStatus.Added).Count();
    }
}

次に、アイテムが変更または追加されるたびに、このために変更されたプロパティを明示的に発生させる必要があります。

public void AddItem()
{
    ...
    OnPropertyChanged("AddedCount");
}

次に、次のような XAML コードをバインドするだけです。

<TextBlock Text="{Binding AddedCount}" />

アイテムがいつ変更されたかを知るために、コレクション内の変更イベントを購読する必要がある場合があります。

別:

ListCollectionView特定のフィルターを使用して を作成し、そのCountプロパティにバインドすることもできます。

    AddedItems = new ListCollectionView(TestItems);
    AddedItems.Filter = r => ((SpecialPriceRow)r).Status == ChangeStatus.Added;

XAML では、次のCountプロパティにバインドします。

<TextBlock Text="{Binding AddedItems.Count}" />

これには、コレクション内の追加および削除されたアイテムを自動的に追跡し、それ自体を更新するという利点があります。ただし、フィルターに影響を与えるアイテムのプロパティが変更された場合は、手動で更新する必要があります。

于 2013-02-03T01:36:09.470 に答える