2010-10-28 3 views
13

Мы используем Caliburn.Micro в новом проекте Silverlight и отлично работаем. Встроенные соглашения связывают кнопки с событиями clickModel, но я не уверен, что лучший способ обработать событие selectionChanged для datagrids и comboboxes.Binding SelectionChanged to ViewModel с использованием Caliburn.Micro

В настоящий момент я привязываюсь к выбранному элементу и вызывается пользовательскую логику, но я чувствую, что это немного запах кода и что я должен разделять настройку свойства и события 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(); 
    } 
} 

ответ

16

Я использую эту технику регулярно, и я чувствую себя очень комфортно с ней.
Я прекрасно понимаю, что виртуальная машина реагирует на изменение своего собственного состояния без необходимости в внешнем акторе (который, кстати, является видом, но может быть и другим компонентом), чтобы установить новое состояние, THEN сигнализирует VM, что состояние изменено.

Если вы действительно хотите, однако, вы можете использовать Message.Attach придает свойство зацепить событие в представлении к действию в VM:

cal:Message.Attach="[Event SelectionChanged] = [OnSelectionChangedAction]" 

(смотри также http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)

-1

Вот пример для MVVM и Caliburn.Micro с использованием. Некоторые действия, такие как SelectionChanged, должны содержать явные аргументы события, поэтому вы должны установить его в части действия события caliburn. Freqently первый аргумент передает $ this (фактический элемент ui, к которому привязано действие). Вы получаете обработчик datacontext для строки, но чтобы перейти к Grid, вы должны передать $ source, как первый аргумент ($ source - является фактическим элементом FrameworkElement, который инициировал отправку ActionMessage). Согласно руководству Caliburn manual.

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(); 
    } 
+0

Добро пожаловать на ТАК! Объясните причины для кода для ОП. Не только «Как», но и «Почему». – garfbradaz

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