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