2013-09-30 4 views
-2

У меня есть класс Animal. В классе Animal у меня есть список другого класса Dogs.C# Вложенный класс

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


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

Возможно, что список может содержать около 500 собак в любой момент времени. Я хочу иметь событие, так что, если значение неопределенного свойства в собаке изменится, CountNeutedDogs будет проинформирован и обновлен. Как мне это сделать?

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

Я должен объяснить список собак связан с DataGrid. Пользователь может изменить свойство neuted от false до true и наоборот. У меня есть & набор для объекта. Таким образом, значение neuted может измениться, и мне нужно обновить значение CountNeutedDogs, поэтому я думал об использовании события, но не знаю, как это сделать.

+0

Я думаю, что создание вложенного класса для 'Собака' немного странно. Я бы не создал его как внутренний класс, потому что «Собака» могла также использоваться в классе «Млекопитающее». –

+0

Могу ли я предложить, чтобы ваше моделирование объектов было немного необычным. В реальном мире у Животного нет собаки (или собак), скорее, например, у фунта может быть коллекция собак, а собака - животное (т. Е. Является подклассом). – Surfbutler

+0

Я ценю, что моделирование объектов, вероятно, неверно. Я только что создал этот пример (должен был использовать лучший, урок, извлеченный в следующий раз!), Чтобы узнать, как создать событие в своем классе Dog, чтобы обновить свойство в моем классе Animal. – mHelpMe

ответ

2

Это наблюдение на Комментарии:

Я привел пример, (не тестировалось !!) как вы можете решить эту проблему путем реализации ObservableCollection и 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.

+0

спасибо за пример кода. Можно ли сделать что-то подобное, не делая список собак ObservableCollection? – mHelpMe

+0

Вы можете проверить здесь: _BindingList_ http://msdn.microsoft.com/en-us/library/ms132679.aspx –

+1

@JeroenvanLangen Это довольно интересный способ сделать это, однако я не считаю, что это обрабатывает случай, когда собака в списке обновляется извне. Вам не нужно было прикреплять и отсоединяться к событию PropertyChanged каждой собаки, когда они будут добавлены и удалены? – Ashigore

4

Если вы CountNeutedDogs свойство, как это так, то всегда будет правильно без событий обновления:

int CountNeutedDogs 
{ 
    get 
    { 
     return this.Dogs.Where(d => d.neuted).Count(); 
    } 
} 
+0

@ jeroen-van-langen Спасибо за исправление счета, я просто заметил, что забыл добавить его :) – Ashigore

+0

Я думаю, что это приятное решение, которое вы предоставили. Не нужно давать тот же ответ :). +1 –

+0

OP запросил метод обновления «NeutedDogsCount», когда добавлена ​​Собака. Поэтому я предложил что-то. –

Смежные вопросы