ViewModel和Model并观察变化

时间:2014-11-02 10:23:43

标签: c# mvvm

ViewModels应该与其他ViewModel关联并与它们交互,还是应该只允许与Models交互?或两者兼而有之?

我会尝试更明确地使用代码:

这段代码好吗?

public class MainViewModel
{
    public MainViewModel(IPeopleService service)
    {
        var people = service.GetPeople();
        People = new ObservableCollection<PersonViewModel>(people.Select(p => new PersonViewModel(p)));
    }

    public ObservableCollection<PersonViewModel> People { get; set; }
    public PersonViewModel SelectedPerson { get; set; }
}

您会看到SelectedPerson是ViewModel,而不是Model。

1 个答案:

答案 0 :(得分:0)

ViewModel可以与其他视图模型进行交互,但不是您的方式。在您的scenerio中,MainViewModel依赖于PersonViewModel。这是错误的方法,它应该是人物模型。

如果要与ViewModel交互并在它们之间传输数据,则应使用mediator模式。许多流行的MVVM框架都具有此功能,它被称为Messenger服务。

编辑:这是一个示例代码。我通常使用MVVM Light,但你可以使用你想要的任何东西。

 public class MainViewModel
{
    public MainViewModel(IPeopleService service)
    {
        var people = service.GetPeople();
        People = new ObservableCollection<Person>(people.Select(p => new Person(p)));
    }

    public ObservableCollection<Person> People { get; set; }

    private Person _person;
    public Person SelectedPerson
    {
        get
        {
            return _person;
        }
        set
        {
            if(value != null)
            {
                _person = value;
                OnPropertyChanged("SelectedPerson");
                //Send selected person on each change
                Messenger.Default.Send<Person>(_person);
            }
        }
    }
}

在PersonViewModel中,您应该注册Person的消息类型:

 public class PersonViewModel
{
    private Person _person;
    public Person SelectedPerson
    {
        get
        {
            return _person;
        }
        set
        {
            if (value != null)
            {
                _person = value;
                OnPropertyChanged("SelectedPerson");                    
            }
        }
    }
    public PersonViewModel()
    {
        Messenger.Default.Register<Person>(this, (p) =>
            {
                SelectedPerson = p;
            });
    }
}