c# - 将事件从项目路由到MVVM中的集合

标签 c# silverlight-4.0 mvvm routed-events icollection

我该怎么做?

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而不是该人。

最佳答案

您可以遵守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);
        }
    }
}

关于c# - 将事件从项目路由到MVVM中的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8254085/

相关文章:

c# - HttpPostedFileBase 总是返回 null 并且图像不会被发布

wpf - 我的设计如何实现 MVVM?

silverlight - 在 Silverlight 4 中拖放文件上传?

c# - Silverlight:将文件流式传输到新的 HTML 浏览器窗口以提示用户到 "open or save as..."?

Silverlight 4 和真正的 3d 支持

wpf - 如何在MVVM中实现分页?

MVVM 有什么用? window 电话 8

c# - 不同可能的子类的函数返回列表

c# - 将 Visual Studio 2010 升级到 2013 后日语源代码损坏

c# - 标签单击事件以在 C# 中的新线程上运行