Запуская событие двойного щелчка из объекта WPF ListView с помощью MVVM

Слишком много людей помещают объекты, которые не являются потокобезопасными, в шаблон синглтона. Я видел примеры DataContext ( LINQ & to nbsp; SQL ), выполненного в одноэлементном шаблоне, несмотря на тот факт, что DataContext не является потокобезопасным и является чисто единичным объектом.

100
задан Emad Gabriel 23 June 2009 в 20:35
поделиться

3 ответа

Вы можете использовать функцию Action Caliburn для сопоставления событий с методами в вашей ViewModel. Предполагая, что у вас есть метод ItemActivated на вашей ViewModel , тогда соответствующий XAML будет выглядеть так:

<ListView x:Name="list" 
   Message.Attach="[Event MouseDoubleClick] = [Action ItemActivated(list.SelectedItem)]" >

Для получения дополнительных сведений вы можете изучить документацию и образцы Caliburn.

4
ответ дан 24 November 2019 в 04:50
поделиться

Мне нравится использовать Attached Command Behaviors и Commands. Марлон Греч имеет очень хорошую реализацию прикрепленного командного поведения. Используя их, мы могли бы затем назначить стиль свойству ListView ItemContainerStyle , которое будет устанавливать команду для каждого ListViewItem.

Здесь мы устанавливаем команду, которая будет запускаться при событии MouseDoubleClick, и CommandParameter будет быть объектом данных, на который мы нажимаем. Здесь я поднимаюсь вверх по визуальному дереву, чтобы получить команду, которую использую, но вы можете так же легко создавать команды для всего приложения.

<Style x:Key="Local_OpenEntityStyle"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="acb:CommandBehavior.Event"
            Value="MouseDoubleClick" />
    <Setter Property="acb:CommandBehavior.Command"
            Value="{Binding ElementName=uiEntityListDisplay, Path=DataContext.OpenEntityCommand}" />
    <Setter Property="acb:CommandBehavior.CommandParameter"
            Value="{Binding}" />
</Style>

Для команд вы можете напрямую реализовать ICommand , или используйте некоторые из помощников, подобных тем, что входят в MVVM Toolkit .

44
ответ дан 24 November 2019 в 04:50
поделиться

Please, code behind is not a bad thing at all. Unfortunately, quite a lot people in the WPF community got this wrong.

MVVM is not a pattern to eliminate the code behind. It is to separate the view part (appearance, animations, etc.) from the logic part (workflow). Furthermore, you are able to unit test the logic part.

I know enough scenarios where you have to write code behind because data binding is not a solution to everything. In your scenario I would handle the DoubleClick event in the code behind file and delegate this call to the ViewModel.

Sample applications that use code behind and still fulfill the MVVM separation can be found here:

WPF Application Framework (WAF) - http://waf.codeplex.com

77
ответ дан 24 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: