Привязка SelectionChanged к ViewModel с использованием Caliburn.Micro - PullRequest
14 голосов
/ 28 октября 2010

Мы используем Caliburn.Micro для нового проекта Silverlight, и все отлично работает. Встроенные соглашения связывают события нажатия кнопок с viewModel, но я не уверен, каков наилучший способ обработки события selectionChanged для сеток данных и комбинированных списков.

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

Ответы [ 2 ]

19 голосов
/ 28 октября 2010

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

Однако, если вы действительно хотите, вы можете использовать присоединенное свойство Message.Attach, чтобы привязать событие в представлении к действию в ВМ:

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

(см. Также https://caliburnmicro.com/documentation/actions)

1 голос
/ 06 июля 2017

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

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