您认为这个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; }
}
}
答案 0 :(得分:1)
嗯,这是脱钩而且有脱钩。
让模型对其视图的实现细节一无所知是一回事。那很好。
拥有一个不能在动态视图中使用的模型是另一回事。如果模型类没有实现更改通知,则难以可靠地使UI与模型的状态保持同步。您可以通过将更改通知全部放入视图类来尝试虚假更新通知,但在一天结束时,将会在某处直接更改模型状态的代码,如果它没有实现更改通知,则我不会知道它,UI会不同步。
我可能不会在IList<Star>
中使用公共设置器实现Galaxy
属性。我会创建Stars
类型的StarList
属性,并创建一个实现StarList
的{{1}}类,除非我有充分的理由不这样做。