MVVM中的分层数据问题

时间:2010-01-26 18:32:08

标签: c# wpf mvvm observablecollection

您认为这个Model-ViewModel实现是否正确? 请注意,Stars(在VM中)是另一个内部的VM的ObservableCollection,我觉得它将VM与M分离,因为从Stars中删除元素时,我仍然需要手动删除它的模型。

有关如何在不使用OnCollectionChanged的情况下改进此功能的任何想法? 提前谢谢。

型号:

public class Galaxy
{
    public Galaxy(string name, IList<Star> stars)
    {
        Name = name;
        Stars = stars;
    }
    public string Name { get; set; }
    public IList<Star> Stars { get; set; }
}

public class Star
{
    public Star(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

ViewModels:

public class GalaxyVM : ViewModelBase
{
    private Galaxy _galaxy;
    private ObservableCollection<StarVM> _stars;

    public GalaxyVM(Galaxy galaxy)
    {
        _galaxy = galaxy;
        _stars = new ObservableCollection<StarVM>(from sys in _galaxy.Stars
                                                  select new StarVM(sys));
    }

    public string Name
    {
        get { return _galaxy.Name; }
    }
    public ObservableCollection<StarVM> Stars
    {
        get { return _stars; }
    }
}

public class StarVM : ViewModelBase
{
    private Star _star;
    public StarVM(Star star)
    {
        _star = star;
    }
    public string Name
    {
        get { return _star.Name; }
    }
}

1 个答案:

答案 0 :(得分:1)

嗯,这是脱钩而且有脱钩。

让模型对其视图的实现细节一无所知是一回事。那很好。

拥有一个不能在动态视图中使用的模型是另一回事。如果模型类没有实现更改通知,则难以可靠地使UI与模型的状态保持同步。您可以通过将更改通知全部放入视图类来尝试虚假更新通知,但在一天结束时,将会在某处直接更改模型状态的代码,如果它没有实现更改通知,则我不会知道它,UI会不同步。

我可能不会在IList<Star>中使用公共设置器实现Galaxy属性。我会创建Stars类型的StarList属性,并创建一个实现StarList的{​​{1}}类,除非我有充分的理由不这样做。