-2

私は動物のクラスを持っています。Animal クラス内には、Dogs という別のクラスのリストがあります。

class Animal
{
  List<Dog> Dogs;
  int CountNeutedDogs;


  class Dog
  {
     // some properties
     boolean neuted;
   }
 }

リストには、一度に約 500 匹の犬が含まれる可能性があります。犬の去勢されたプロパティの値が変更された場合に CountNeutedDogs が通知され、更新されるように、イベントが必要です。どうすればいいですか?

編集

Dogs がデータグリッドにバインドされているリストについて説明する必要があります。ユーザーは、neuted プロパティを false から true に、またはその逆に変更できます。プロパティの get & set があります。したがって、中和された値は変更される可能性があり、CountNeutedDogs 値を更新する必要があるため、イベントの使用を考えていましたが、その方法がわかりません。

4

2 に答える 2

4

CountNeutedDogs をそのようにプロパティにすると、イベントが更新されなくても常に正しくなります。

int CountNeutedDogs
{
    get
    {
        return this.Dogs.Where(d => d.neuted).Count();
    }
}
于 2013-09-30T09:11:01.830 に答える
2

これはコメントのフォローアップです。

例を作成しました(テストされていません!!)ObservableCollection andを実装することでこれを解決する方法INotifyPropertyChanged

public class Dog : INotifyPropertyChanged
{
    private bool _isNeutered;

    public bool IsNeutered 
    {
        get { return _isNeutered; }
        set 
        {
            if (_isNeutered != value)
            {
                _isNeutered = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("IsNeutered"));
            }
        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

public class Animals : INotifyPropertyChanged
{
    private ObservableCollection<Dog> _dogs = new ObservableCollection<Dog>();

    public Animals()
    {
        _dogs.CollectionChanged += Dogs_CollectionChanged;
    }


    // NOTE, I haven't checked this!! But I think it should be something like this:
    private void Dogs_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Add:
                foreach (INotifyPropertyChanged item in e.NewItems.OfType<INotifyPropertyChanged>())
                    item.PropertyChanged += Item_PropertyChanged;
                break;

            case NotifyCollectionChangedAction.Reset:
            case NotifyCollectionChangedAction.Remove:
                foreach (INotifyPropertyChanged item in e.OldItems.OfType<INotifyPropertyChanged>())
                    item.PropertyChanged -= Item_PropertyChanged;
                break;
        }

        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("NeuteredDogsCount"));
    }

    private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("NeuteredDogsCount"));
    }

    public IEnumerable<Dog> Dogs 
    { 
        get { return _dogs; } 
    }

    public int NeuteredDogsCount
    {
        get
        {
            return Dogs.Where(dog => dog.IsNeutered).Count();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

したがって、コレクションが変更されると、NeuteredDogsCountプロパティの通知が送信されます。このようにして、制限されたコントロールはプロパティを再評価しNeuteredDogsCountます。

「通常の」プロパティの代わりに、IsNeuteredを に変更できますDependencyProperty

于 2013-09-30T09:31:39.490 に答える