2015-11-06 16 views
0

Я пытаюсь найти оптимальную практику для создания моделей и сервисов просмотра (служба просто ведет переговоры с сервером и возвращает данные обратно, чтобы просмотреть модель). Я видел два разных подхода.WPF - Использование поведения для создания модели представления и сервисов

  1. Используя вид модели локатора
  2. Использование поведения (я не уверен, если это хороший подход)

Для второго подхода, можно определить поведение на UserControl и прикрепить событие, создать экземпляр модели представления и экземпляр службы и объединить их все вместе.

protected override void OnAttached() 
    { 
     var service = Activator.CreateInstance(ServiceType) 
     var viewModel = Activator.CreateInstance(ModelType); 
     base.AssociatedObject.DataContext = viewModel; 
     base.OnAttached(); 
    } 

и в вашем UserControl XAML

<i:Interaction.Behaviors> 
    <be:ViewModelBehavior ViewModelType="{x:Type vm:ViewModel1}" ServiceType="{x:Type serv:Service1}"/> 
</i:Interaction.Behaviors> 

Является ли это хорошее использование поведения, или я должен просто использовать ViewModel шаблон локатора.

+0

Ваше поведение - это не что иное, как ViewModelLocator, реализованный как поведение. Также совершенно непонятно, что вы понимаете в ViewModelLocator. В общем, это любой компонент, который позволяет вам получить доступ к экземплярам viewmodel и имеет много разновидностей. – Liero

+0

Я смотрю на реализацию MVVM light для локатора взглядов модели. Вы предлагаете, чтобы 1-й подход был лучше? –

ответ

1

У вашего поведения есть один существенный недостаток - в каждом usercontrol вы должны указать поведение, ViewModelType (и ServiceType, а также).

Вы можете сделать следующее:

<UserControl x:Class="MyApp.HomePage" .... 
      local:ViewModelLocator.AutoWireViewModel="True"> 
    ... 
</UserControl> 

При установке вложенное свойство истинно, ViewModelLocator создаст ViewModel экземпляр и назначить его DataContext в UserControl в. ViewModelLocatator использует соглашение об именах для определения типа модели. В этом случае это может быть HomePageViewModel, так как тип вида HomePage.

Этот подход используется PRISM ViewModelLocator из библиотеки Prism.Mvvm, но я рекомендую вам написать свой собственный, поскольку это довольно просто.

Это в основном похож на ваш ViewModelBehavior, но повторно два отличия:

  1. поведение реализуется в виде вложенного свойства. Он позволяет указать поведение в стиле, поэтому оно будет применяться к любому пользовательскому контрукту, который использует этот стиль. Вы не можете указать Interaction.Behaviors в стилях.

  2. Он использует именования вместо явного набора ViewModelType


Что касается сервиса, который должен быть передан в качестве параметра ViewModel: Вы можете использовать шаблон IoC. Это псевдокод, который описывает шаблон:

public class MyViewModel(IMyService service) {...} 

//at application startup you setup the IoC container: 
IoC.Setup<IMyService>(new MyService()); 

//later 
var viewModel = IoC.GetInstance<MyViewModel>(); //MyService will be passed as to ctor 
+0

Спасибо за все ответы –

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

  • Нет связанных вопросов^_^