Binding SelectionChanged to ViewModel с использованием Caliburn.Micro
Мы используем Caliburn.Micro в новом проекте Silverlight и отлично работаем. Встроенные соглашения связывают кнопки с событиями clickModel, но я не уверен, что лучший способ обработать событие selectionChanged для datagrids и comboboxes.
В настоящий момент я привязываюсь к выбранному элементу и вызывается пользовательскую логику, но я чувствую, что это немного запах кода и что я должен разделять настройку свойства и событие selectedChange. Но если я их разделяю, как мне связать событие с измененным выбором с моим модулем viewModel, командами? или EventTrigger? Или код ниже приемлемый? Это небольшое изменение, но я делаю эту логику повсюду.
private Foo _selectedFoo;
public Foo SelectedFoo
{
get
{
return _Foo;
}
set
{
if (_Foo != null && _Foo.Equals(value)) return;
_Foo = value;
NotifyOfPropertyChange("SelectedFoo");
NotifyOfPropertyChange("CanRemove");
LoadRelatedBars();
}
}
Ответы
Ответ 1
Я использую эту технику регулярно, и я чувствую себя очень комфортно с ней.
Я прекрасно понимаю, что виртуальная машина реагирует на изменение своего собственного состояния без необходимости в внешнем акторе (который, кстати, является View, но может быть и другим компонентом), чтобы установить новое состояние, THEN сигнализирует виртуальной машине о том, что это состояние изменилось.
Если вы действительно хотите, однако, вы можете использовать свойство Message.Attach для привязки события в представлении к действию в виртуальной машине:
cal:Message.Attach="[Event SelectionChanged] = [OnSelectionChangedAction]"
(см. также http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)
Ответ 2
Вот пример для MVVM и Caliburn.Micro с использованием. Некоторые действия, такие как SelectionChanged, должны содержать явные аргументы события, поэтому вы должны установить его в части действия события caliburn. Freqently первый аргумент передает $this (фактический элемент ui, к которому привязано действие). Вы получаете обработчик datacontext для строки, но чтобы перейти к Grid, вы должны передать $source, как первый аргумент ($ source - является фактическим элементом FrameworkElement, который инициировал отправку ActionMessage). Согласно руководству руководство Caliburn.
XAML
cal:Message.Attach="[Event SelectionChanged]=[Action DataGrid_JobTypesSelectionChanged($source,$eventArgs)];"
код:
public void DataGrid_JobTypesSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var grid = sender as DataGrid;
JobTypesSelectedCollection = grid.SelectedItems.Cast<JobComplexModel>().ToList();
}