gpt4 book ai didi

c# - MVVM 中的分层数据问题

转载 作者:行者123 更新时间:2023-12-03 10:41:00 25 4
gpt4 key购买 nike

你认为这个 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; }
}

View 模型:
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; }
}
}

最佳答案

嗯,有脱钩,也有脱钩。

拥有一个对其 View 的实现细节一无所知的模型是一回事。那挺好的。

拥有一个不能在动态 View 中使用的模型是另一回事。如果模型类不实现更改通知,则很难可靠地使 UI 与模型的状态保持同步。您可以尝试通过将所有更改通知都放入您的 View 类来伪造更改通知,但最终会有代码直接更改模型的状态,如果它没有实现更改通知 View 不会知道它,并且 UI 将不同步。

我可能不会实现 IList<Star> Galaxy 中具有公共(public) setter 的属性.我会制作 Stars StarList 类型的属性,并创建一个 StarList实现的类IList<Star> ,除非我有充分的理由不这样做。

关于c# - MVVM 中的分层数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com