Маршрутное событие Из Предмета в Коллекцию в MVVM - PullRequest
1 голос
/ 24 ноября 2011

Как я могу сделать что-то подобное?

public class person 
{
  public ICommand Add_as_Friend { get; private set; }

  public event EventHandler C1_Friend_Add;

  //....

  Add_as_Friend = new Command(Handle_Add_FR, HandleCan_Add_FR);
  void Handle_Add_FR(object parameter)
  {
    Friend_Add(this, new EventArgs());
  }
}

public class person_Collection : ObservableCollection<person>
{
  //.....
  //???
}

public class MainViewModel : ViewModelBase
{
  public person_Collection person_List{ get; set; }
  public person_Collection person_List2{ get; set; }

  person_Collection.???.item.Friend_Add += new EventHandler(Add);

  void Add(object sender, EventArgs e)
  {
    myPerson = sender as person;
    person_List2.add(myPerson);
    //...
  }
} 

ICommand Add_as_Friend - это кнопка в ItemsControl.

Мне нужно отправить событие в MainViewModel, а не в лицо.

1 Ответ

0 голосов
/ 24 ноября 2011

Вы можете выделить свою ObservableCollection и зарегистрировать EventHandler для всех новых элементов, подобных этому (я не совсем использую вашу структуру классов, вам придется изменить ее для вашего проекта):

public class MainViewModel : ViewModelBase
{
    public ObservableCollection<Person> Persons { get; set; }

    public MainViewModel()
    {
        Persons = new ObservableCollection<Person>();
        Persons.CollectionChanged += PersonCollectionChanged;
    }

    private void PersonCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if(e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach(Person person in e.NewItems)
            {
                person.Friend_Add += new EventHandler(Add);
            }
        }
    }
}

Редактировать: внизу - реализация класса PersonCollection, который вы хотите использовать. Теперь вы можете выбрать, хотите ли вы использовать одну из этих реализаций. (Я бы предпочел первое)

public class Person
{
    public event EventHandler AddedFriend;
}

public class PersonCollection : ObservableCollection<Person>
{
    public event EventHandler AddedFriend;

    public PersonCollection() : base(new ObservableCollection<Person>())
    {
        base.CollectionChanged += PersonCollectionChanged;
    }

    private void PersonCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (Person person in e.NewItems)
            {
                person.AddedFriend += PersonAddedFriend;
            }
        }
    }

    private void PersonAddedFriend(object sender, EventArgs e)
    {
        var addedFriend = AddedFriend;
        if (addedFriend != null)
        {
            addedFriend(sender, e);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...