Передача аргументов и отправителей события в RelayCommand - PullRequest
10 голосов
/ 03 июня 2010

Как получить отправителя события при использовании RelayCommand?

Ответы [ 3 ]

19 голосов
/ 03 июня 2010

Это один из тех мучительных ответов, где я на самом деле не отвечаю на ваш вопрос, а вместо этого буду читать вам лекции о том, что вы должны делать по-другому. Так что извините за это. Здесь идет:

Если вы оказались в положении, когда вам нужно добраться до объекта-отправителя в вашей модели представления, то вам, вероятно, следует сделать что-то другое. Ссылаясь, скажем, на кнопку или ListBox в вашей модели представления, вы сделали эту модель осведомленной о концепциях пользовательского интерфейса, о которых она ничего не должна знать. Вместо этого я предлагаю подключиться к событию на странице с выделенным кодом, выяснить, что вам нужно знать об отправителе, а что нет, а затем выполнить команду viewmodel программно. Это также нарушает MVVM-правила, но, по-моему, это гораздо более легкий взлом, чем ссылка на отправителя в вашей модели представления.

10 голосов
/ 04 июня 2010

У меня была похожая проблема, но мне нужно было только получить EventArgs. К счастью, это было нелепо просто, когда я нашел ответ в другой теме здесь, в Переполнении стека.

<cmd:EventToCommand Command="{Binding SomeCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>

Как только вы узнаете об этом волшебном параметре "PassEventArgsToCommand", вы - золотой. Просто используйте RelayCommand<type> вместо простого RelayCommand.

Надеюсь, это поможет.

7 голосов
/ 12 декабря 2012

Это можно сделать, привязав отправителя к параметру команды.

<command:EventToCommand
              Command="{Binding CommandName}"
              CommandParameter="{Binding RelativeSource=
                                         { RelativeSource FindAncestor, 
                                           AncestorType={x:Type TypeOfSender},
                                           AncestorLevel=1}}" 
              PassEventArgsToCommand="True" >
</command:EventToCommand>
...