Подтвердить что ты не робот

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();
    }
}
4b9b3361

Ответ 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();
    }