2010-06-03 7 views

답변

15

이것은 실제로 당신의 질문에 대답하지 않지만, 당신이해야 할 일에 대해 당신이 다르게 가르쳐야 할 고통입니다. 죄송합니다. 여기에 간다 :

viewmodel의 보낸 사람 개체를 가져와야하는 위치에 있다면 아마도 다른 것을해야 할 것이다. 뷰 모델의 Button이나 ListBox를 참조함으로써 뷰 모델은 UI 개념에 대해 알지 못하게했습니다. 내 제안은 대신 코드 숨김 페이지에서 이벤트에 연결하고 보낸 사람 또는 무엇에 대해 알아야하는지 알아 낸 다음 viewmodel 명령을 프로그래밍 방식으로 실행하는 것입니다. 또한 MVVM "규칙"을 위반하고 있지만 IMHO는보기 모델에서 보낸 사람을 참조하는 것보다 훨씬 가벼운 해킹입니다.

+0

는, 어쩌면보기 기반 eventarg 변환 ... 다른 길을 가고위한 컨버터를 사용하는 몇 가지 방법이 있어야한다 non-view 유형으로? –

+0

MVVM 규칙을 어기는 방법은 무엇입니까? 나 한테 잘됐다. –

+0

당시 나의 주요 문제는 VM의 명령에 버튼을 바인딩하는 것 (보기에서)과 달리 지나치게 복잡하다는 것입니다. 지금 그것을 보면서 나는 네가 옳다고 생각한다. 그것은 어떤 규칙도 실제로 깨뜨리지 않습니다. –

9

비슷한 문제가 있었지만 EventArgs 만 필요했습니다. 다행스럽게도 스택 오버플로 (Stack Overflow)에서 다른 스레드에서 대답을 찾으면 이것은 터무니없이 간단합니다.

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

"PassEventArgsToCommand"설정에 대해 알고 있으면 황금색입니다. 일반 RelayCommand 대신 RelayCommand<type>을 사용하십시오.

이 정보가 도움이되기를 바랍니다.

+5

그냥 논평하고 싶습니다 : PassEventArgsToCommand는 UI 클래스 (EventArgs)를 VM에 가져 와서 분리를 파기하기 때문에 매우 깨끗합니다. 이를 사용하면 VM을 덜 테스트 할 수 있습니다. 그러나 시나리오가 (드래그 & 드롭, 예를 들면) 다른 것들이 심지어 더러운 것입니다. 이것이 내가 EventToCommand에 추가 한 이유입니다. 많은주의를 기울이고 사용하십시오! – LBugnion

+2

PassEventArgsToCommand가 깨끗한 것은 아니지만 내 WP7 앱에 SkyDrive 지원을 추가하는 것이 유용하다는 것을 알았습니다. signin 버튼은 이벤트 args를 통해 실시간 세션 정보를 전달합니다. 코드 숨김으로 이벤트를 처리하고 ViewModel에 Session 속성을 설정 한 다음 명령을 호출 할 수 있습니다. PassEventArgsToCommand는 이해하기 쉬운 코드를 작성하는 데 도움이됩니다. – rams

5

송신자를 명령 매개 변수에 바인딩하여 수행 할 수 있습니다. VM이 공개 설정을 노출 (대신 XAML에서 변환기를 사용)하지 말아야하는 것처럼

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

Henrik은 이것이 완료되어서는 안된다고 설명하는 동안 올바른 것이지만 세계는 완벽하지 않으며 순수한 MVVM을 달성하는 것이 때로는 불가능하기 때문에 나는 이것을 반대했습니다. 예를 들어, 텍스트 상자에서 포커스를받을 때 텍스트를 모두 선택하려면 SelectAll() 멤버를 호출하기 위해 TextBox 자체가 필요합니다. 의심 할 여지없이 MVVM에서 가능하지만 의심 할 여지없이 복잡한 코드가 생성되지만이 솔루션은 경우에 따라 "충분 함"입니다. 나는이 행동이 가능한 한 실망감을 느끼지 않을 것을 동의하지만 때로는 단지 실용적이어야하고 이와 같은 수정이 필요하다. 추악한 것은 작동한다. – Bas

+2

또 다른 예 : WPF WebBrowser 컨트롤. Navigated 이벤트에 명령을 바인드 할 수 있지만 실제로 http 응답으로 작업을 수행하려면 해당 정보가 eventargs에 없기 때문에 브라우저 자체에 대한 참조가 필요합니다. – Bas