Иерархические проблемы с данными в MVVM - PullRequest
1 голос
/ 26 января 2010

Как вы думаете, эта реализация Model-ViewModel верна? Обратите внимание, что Stars (в виртуальной машине) - это ObservableCollection виртуальных машин внутри другой, и я чувствую, что она отделяет виртуальную машину от 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 Ответ

1 голос
/ 27 января 2010

Ну, есть разделение и есть разделение.

Одно дело иметь модель, которая ничего не знает о деталях реализации своих представлений. Это хорошо.

Другое дело иметь модель, которую нельзя использовать в динамических представлениях. Если класс модели не реализует уведомление об изменениях, будет трудно надежно синхронизировать интерфейс с состоянием модели. Вы можете попытаться обмануть уведомление об изменении, поместив все это в ваши классы представлений, но в конце концов будет где-то код, который напрямую изменит состояние модели, и если он не реализует уведомление об изменении, представления не буду знать об этом, и пользовательский интерфейс выйдет из синхронизации.

Возможно, я бы не реализовал свойство IList<Star> с открытым сеттером в Galaxy. Я сделал бы свойство Stars типа StarList и создал бы класс StarList, который реализовал IList<Star>, если только у меня не было очень веской причины не делать это.

...