【问题标题】:Hierarchical data problems in MVVMMVVM 中的分层数据问题
【发布时间】:2010-01-26 18:32:08
【问题描述】:

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

视图模型:

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; }
    }
}

【问题讨论】:

  • 如果您不想实现 OnCollectionChanged,为什么还要使用 ObservableCollection?
  • 因为我需要更新 UI,我不想用它来同步 Model 和 ViewModel。

标签: c# wpf mvvm observablecollection


【解决方案1】:

嗯,有解耦,也有解耦。

拥有一个对其视图的实现细节一无所知的模型是一回事。这很好。

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

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

【讨论】:

  • 谢谢罗伯特,那么我想在模型中实现 ObservableCollection 也是有意义的,当其他人更改它时通知视图模型。我对吗?顺便说一句,我没有看到您建议的更改的重点,请启发我:)
  • IList&lt;Star&gt; 的公共设置器意味着创建Galaxy 类实例的任何东西都可以决定该属性将包含哪种类型的列表。这会导致一种错误的印象,即只要它是一个列表,您就不会关心它;事实上,您可能需要它来实现更改通知,以便您的 UI 能够正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2011-03-16
  • 2010-12-15
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多