Как я могу добавить новую команду в событие элемента управления - PullRequest
2 голосов
/ 21 апреля 2010

спасибо, что взглянули на этот вопрос.

Я создавал приложение (VB / WPF) по примеру Джоша Смита с шаблоном MVVM: Нажмите здесь, чтобы просмотреть

Мои представления имеют элементы управления, которые запускают команду при возникновении события, такого как нажатие кнопки, и они привязаны к свойствам в ViewModel.

My ViewModel предоставляет свойства типа ICommand, которые вызывают соответствующие методы.

Это работало хорошо, до сих пор! Теперь я хочу использовать Thumb Control, чтобы позволить пользователю перемещать объект в пределах Canvas. Я не верю, что у большого пальца есть возможность командования «из коробки». Большой палец вызывает событие DragDelta при перемещении. Поэтому мой вопрос таков:

Как мне расширить способность Control выдавать команду при событии, пожалуйста?

Я хочу выдать новую Команду, скажем, 'onDragDelta', чтобы я мог связать ее со свойством в моей ViewModel, как мои кнопки.

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

То, что вы хотите, это запустить ICommand в вашей ViewModel на основе RoutedEvent FrameworkElement. К сожалению, WPF не поддерживает это "из коробки". Некоторые возможности:

1) В Expression Blend 3 есть Microsoft.Expression.Interactivity.dll, которая позволяет это. См. WPF: смесь 3 взаимодействий / поведения для примера того, как это сделать.

2) В вашем коде может быть обработчик событий, который напрямую вызывает соответствующую команду ViewModel. Например:

private void FrameworkElement_DragDelta(object sender, EventArgs e)
{
    this.MyViewModel.OnDragDelta(sender, e);
}

3) Как часть Cinch , существует присоединенная команда поведения . Таким образом, вам не нужно менять свой код. Например:

Cinch:SingleEventCommand.RoutedEventName="DragDelta"
Cinch:SingleEventCommand.TheCommandToRun="{Binding Path=DragDeltaCommand}"

Обратите внимание, что это вызывает ICommand и передает объект (на самом деле SCommandArgs) в качестве параметра команды. Чтобы получить действительные аргументы перенаправленного события в вашем обработчике команд, выполните следующие действия:

var sargs = args as SCommandArgs;
if (sargs == null)
{
    return;
}

var routedEventArgs = sargs.EventArgs as RoutedEventArgs; // Or whatever arguments you actually expect
if (routedEventArgs == null)
{
    return;
}

// Do something here with the event arguments

РЕДАКТИРОВАТЬ: Также взгляните на Привязка команд к событиям?

0 голосов
/ 21 апреля 2010

Вместо использования ICommand я бы предпочел привязку данных текущей позиции большого пальца к свойству в вашей ViewModel. Теперь, если позиция изменилась, вы можете выполнить какой-либо метод в вашей ViewModel с разницей в качестве параметра.

Я не знаю, соответствует ли это вашим потребностям, но это была моя первая мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...