2013-07-03 3 views
2

Предположим, что некоторые, не все модели в приложении являются статическими и определяются как члены BaseViewModel, так что несколько ViewModels (и по расширению, Views) могут получить доступ к тем же данным, ударив то, что они унаследовали. Вот очень простой макет, в котором два производных класса может получить доступ к тому же модели:Является ли хорошей практикой сделать статическую модель в WPF (MVVM)?

public class EmployeeModel 
{ 
    public string Name; 
    public int Id; 
} 

public class BaseViewModel 
{ 
    private static EmployeeModel employeeModel = new Employee Model(); 
    public EmployeeModel EModel 
    { 
     get { return employeeModel; } 
     set { employeeModel = value; } 
    } 

    public BaseViewModel() {} 
} 

public class EmployeeViewModel : BaseViewModel 
{ 
    public EmployeeViewModel() 
    { 
     base.Emodel.Name = ""; 
    } 
} 

public class HomeViewModel : BaseViewModel 
{ 
    public EmployeeViewModel() 
    { 
     base.Emodel.Name = ""; 
    } 
} 

В конце концов, он получил работу в тех же данных теперь показывают в нескольких представлений без проблем. Однако это не означает, что нет более подходящего способа, о котором я не знаю. Поскольку я новичок в WPF, я чувствую себя вынужденным спросить: «Создает модель статической хорошей практики для шаблона MVVM?» Кроме того, можно ли оптимизировать эту реализацию, и если да, то как?

ответ

1

Я бы сказал, что это не очень хорошая практика. Вы должны favour composition over inheritance. Если вы хотите, чтобы все вы могли поделиться общей частью пользовательского интерфейса, в которой отображается информация о сотруднике (предположительно, в настоящее время зарегистрированный сотрудник), вы говорите о композиции представления.

If you're using MVVM then you should use an MVVM framework. Что-то вроде Caliburn.Micro делает невероятную простоту композиции. В этом случае у вас будет, например, HeaderViewModel с соответствующим HeaderView и что HeaderViewModel возьмет модель сотрудника как зависимость (например, введенную в конструктор).

Другие модели просмотра затем принимают HeaderViewModel (или заводскую) как зависимость через свои конструкторы.

Если вы имеете в виду отображение одной и той же модели по-разному, просто передайте модель в качестве зависимости через конструктор к модели представления (при условии, что требуется зависимость), и чтобы модель представления отображала модель напрямую (нарушение LoD) или делегирование вызовов модели (нарушая принцип DRY).

3

Это не плохая практика, скажут. Поэтому в вашем случае, когда вы используете модель static, ваша программа ведет себя так, как ожидалось, это хорошая практика.

Альтернатива может быть не объявлять эту модели static, но объявить некоторые static моделей держатель, который возвращает точно такой же экземпляр по запросу, так и на другую точку зрения, как сейчас, вы увидите ту же модели представлены в другой путь.

надеюсь, что это поможет.