2015-09-17 4 views
0

Мне сказали, что лучшей практикой для MVVM является передача viewmodel в представление, поэтому он не знает о datacontext перед запуском. (System 1)WPF MVVM привязка наилучшей практики datacontext

Однако каждое сообщение, которое я нахожу, передает viewmodel в xaml datacontext, который не кажется идеальным для MVVM. (System 2)

Каков наилучший способ привязки datacontext в WPF MVVM? Как это влияет на привязку обработчика события?

Пример: У меня есть комбинированная коробка, связанная с элементом в моей модели ViewModel. Когда я использую систему привязки 2, выбор combobox запускает событие «ComboChanged». При использовании системы привязки 1 выбор со списком изменяется, но событие не срабатывает. Как только вся страница загрузится, событие будет вызываться, когда поле со списком будет изменено вручную.

Host (System 1):

public override void Initialise() 
{ 
    element = new Plugin(new ViewModel(Credentials)); 
    element.combobox.SelectedIndex = 0; 
} 

Plugin (System 1):

public Plugin(ViewModel viewModel) 
{ 
    InitializeComponent(); 
    ViewModel = viewModel; 
    this.DataContext = ViewModel; 
    ViewModel.ComboChanged += new EventHandler<ComboChangedEventArgs>(performComboChanged); 
} 

ViewModel (System 1):

public ViewModel(Credentials credentials) 
{ 
    //Initialisation code 
} 

Host (System 2):

public override void Initialise() 
{ 
    element = new Plugin(Credentials) 
    element.combobox.SelectedIndex = 0; 
} 

Plugin (System 2):

public Plugin(Credentials credentials) 
{ 
    InitializeComponent(); 
    ViewModel = ((ViewModel)this.DataContext); 
    ViewModel.Credentials = credentials; 
    ViewModel.ComboChanged += new EventHandler<ComboChangedEventArgs>(performComboChanged); 
} 

//Plugin.xaml 
<UserControl.DataContext> 
    <local:ViewModel/> 
</UserControl.DataContext> 

ViewModel (System 2):

public ViewModel() 
{ 
    //Initialisation code 
} 

Заранее спасибо

+0

Система 1 обеспечивает большую гибкость в течение жизненного цикла ваших ViewModel/услуг. Например, будет проще использовать шаблоны и рамки МОК. Наоборот, я думаю, что система 2 создает новый экземпляр вашей модели представления каждый раз, когда создается представление. В перспективе подходящего подхода MVVM, однако, способ обработки вами события combobox - очень БЕСПЛАТНЫЙ;) – Bruno

+0

Oh! Спасибо. Не могли бы вы рассказать мне, как мне лучше справляться с этим? Я бы очень хотел, чтобы система 1 работала с полем со списком в хорошем MVVM-способе. –

+0

См. Мой полный ответ ниже относительно обработки событий в контексте MVVM – Bruno

ответ

1

Что касается обработки Вашего мероприятия реализации:

Чтобы сделать его коротким:

  • вы никогда не должны привязывать событие к виртуальной машине в своем коде или даже использовать вашу виртуальную машину в коде: презентация и бизнес-код будут смешанными, и если ваше представление изменится, вы можете нарушить свою логику кода.
  • вы никогда не должны использовать свои вид или один из элементов управления в вашей модели просмотра: виртуальная машина - это место для бизнеса, а не для представления

Я всегда помню этот раз, особенно когда мне приходилось полностью переориентировать большой комплексный вид (переименование элементы управления, переключение из списка в gridview, реорганизацию сетки и т. д.): поскольку мой MVVM был чистым (строгое разделение VM/business от представления/презентации), я смог сделать это, не касаясь какой-либо линии из моей бизнес-логики. Это было бы кошмаром, если бы я связал все мои контрольные события напрямую с моей моделью взгляда.

Здесь у вас есть (по крайней мере) два варианта:

  1. использует библиотеку взаимодействия, которая позволит вам связать событие управления с командой вида модели или методом
  2. создать собственное поведение, которое реализовать эту связь между управляющим событием и командой или свойством модели представления.

Это почтовые подытоживает вариант взаимодействия: MVVM events

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