RelayCommand를 사용할 때 어떻게 이벤트 발신자를 얻습니까?RelayCommand에 이벤트 인수 및 발신자 전달
답변
이것은 실제로 당신의 질문에 대답하지 않지만, 당신이해야 할 일에 대해 당신이 다르게 가르쳐야 할 고통입니다. 죄송합니다. 여기에 간다 :
viewmodel의 보낸 사람 개체를 가져와야하는 위치에 있다면 아마도 다른 것을해야 할 것이다. 뷰 모델의 Button이나 ListBox를 참조함으로써 뷰 모델은 UI 개념에 대해 알지 못하게했습니다. 내 제안은 대신 코드 숨김 페이지에서 이벤트에 연결하고 보낸 사람 또는 무엇에 대해 알아야하는지 알아 낸 다음 viewmodel 명령을 프로그래밍 방식으로 실행하는 것입니다. 또한 MVVM "규칙"을 위반하고 있지만 IMHO는보기 모델에서 보낸 사람을 참조하는 것보다 훨씬 가벼운 해킹입니다.
비슷한 문제가 있었지만 EventArgs 만 필요했습니다. 다행스럽게도 스택 오버플로 (Stack Overflow)에서 다른 스레드에서 대답을 찾으면 이것은 터무니없이 간단합니다.
<cmd:EventToCommand Command="{Binding SomeCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
"PassEventArgsToCommand"설정에 대해 알고 있으면 황금색입니다. 일반 RelayCommand 대신 RelayCommand<type>
을 사용하십시오.
이 정보가 도움이되기를 바랍니다.
그냥 논평하고 싶습니다 : PassEventArgsToCommand는 UI 클래스 (EventArgs)를 VM에 가져 와서 분리를 파기하기 때문에 매우 깨끗합니다. 이를 사용하면 VM을 덜 테스트 할 수 있습니다. 그러나 시나리오가 (드래그 & 드롭, 예를 들면) 다른 것들이 심지어 더러운 것입니다. 이것이 내가 EventToCommand에 추가 한 이유입니다. 많은주의를 기울이고 사용하십시오! – LBugnion
PassEventArgsToCommand가 깨끗한 것은 아니지만 내 WP7 앱에 SkyDrive 지원을 추가하는 것이 유용하다는 것을 알았습니다. signin 버튼은 이벤트 args를 통해 실시간 세션 정보를 전달합니다. 코드 숨김으로 이벤트를 처리하고 ViewModel에 Session 속성을 설정 한 다음 명령을 호출 할 수 있습니다. PassEventArgsToCommand는 이해하기 쉬운 코드를 작성하는 데 도움이됩니다. – rams
송신자를 명령 매개 변수에 바인딩하여 수행 할 수 있습니다. VM이 공개 설정을 노출 (대신 XAML에서 변환기를 사용)하지 말아야하는 것처럼
<command:EventToCommand
Command="{Binding CommandName}"
CommandParameter="{Binding RelativeSource=
{ RelativeSource FindAncestor,
AncestorType={x:Type TypeOfSender},
AncestorLevel=1}}"
PassEventArgsToCommand="True" >
</command:EventToCommand>
Henrik은 이것이 완료되어서는 안된다고 설명하는 동안 올바른 것이지만 세계는 완벽하지 않으며 순수한 MVVM을 달성하는 것이 때로는 불가능하기 때문에 나는 이것을 반대했습니다. 예를 들어, 텍스트 상자에서 포커스를받을 때 텍스트를 모두 선택하려면 SelectAll() 멤버를 호출하기 위해 TextBox 자체가 필요합니다. 의심 할 여지없이 MVVM에서 가능하지만 의심 할 여지없이 복잡한 코드가 생성되지만이 솔루션은 경우에 따라 "충분 함"입니다. 나는이 행동이 가능한 한 실망감을 느끼지 않을 것을 동의하지만 때로는 단지 실용적이어야하고 이와 같은 수정이 필요하다. 추악한 것은 작동한다. – Bas
또 다른 예 : WPF WebBrowser 컨트롤. Navigated 이벤트에 명령을 바인드 할 수 있지만 실제로 http 응답으로 작업을 수행하려면 해당 정보가 eventargs에 없기 때문에 브라우저 자체에 대한 참조가 필요합니다. – Bas
는, 어쩌면보기 기반 eventarg 변환 ... 다른 길을 가고위한 컨버터를 사용하는 몇 가지 방법이 있어야한다 non-view 유형으로? –
MVVM 규칙을 어기는 방법은 무엇입니까? 나 한테 잘됐다. –
당시 나의 주요 문제는 VM의 명령에 버튼을 바인딩하는 것 (보기에서)과 달리 지나치게 복잡하다는 것입니다. 지금 그것을 보면서 나는 네가 옳다고 생각한다. 그것은 어떤 규칙도 실제로 깨뜨리지 않습니다. –