2010-01-26 2 views
1

Как вы думаете, эта реализация Model-ViewModel верна? Обратите внимание, что Stars (в VM) является ObservableCollection виртуальных машин внутри другого, и я чувствую, что он отделяет виртуальную машину от M, потому что при удалении элемента из Stars мне все равно нужно удалить его вручную.Иерархические проблемы с данными в MVVM

Любые идеи о том, как улучшить это, не используя 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

Почему вы вообще используете ObservableCollection, если вы не хотите использовать OnCollectionChanged? –

+0

Поскольку мне нужен пользовательский интерфейс для обновления, я не хочу использовать его для синхронизации модели и ViewModel. – Natxo

ответ

1

Ну, там развязку и есть разъединение.

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

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

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

+0

Спасибо, Роберт, тогда я думаю, что было бы целесообразно реализовать ObservableCollection в модели, чтобы уведомить viewmodel, когда кто-то изменил ее. Я прав? BTW Я не вижу смысла в предложенном вами изменении, просветите меня, пожалуйста :) – Natxo

+0

Публичный установщик 'IList ' означает, что что-либо, создающее экземпляр класса «Галактика», может решить, какой список содержит свойство собирается содержать. Это приводит к ошибочному впечатлению, что вас это не волнует, пока это список; на самом деле вам, вероятно, понадобится это для реализации уведомления об изменении, чтобы ваш пользовательский интерфейс функционировал. –

Смежные вопросы