2009-12-31 4 views
3

현재 MVVM/명령 및 ControlTemplates를 사용 중입니다. 내가하려는 것은 상당히 간단합니다. 예를 들어 목록을 갖고 싶습니다. 사용자는 사용자가 각 사용자에 대해 작업을 실행할 수 있습니다. 그러나 이벤트/명령 핸들러는 person 객체가 아닌 실행될 필요가 있습니다. 단추로 목록에서 제거하기를 원하기 때문입니다.MVVM/명령 및 제어 템플릿

그래서 지금까지 PersonVM의 목록과 각 사람 객체의 객체를 표시하는 VM을 작성했습니다. 그런 다음 내 사람을 표시하는 ItemsControl이 포함 된 ControlTemplate을 사용하여 CustomControl을 만들었습니다.

모든 데이터가 훌륭하게 표시되며 아무런 문제가 없습니다.

그런 다음 사용자가 목록에서 사람을 삭제할 수있는 부분을 추가하려고했습니다. 그래서 나는 datatemplate에 버튼을 추가했습니다. 여전히 문제는 아닙니다.

다음 단계는 단추에 의해 트리거되는 명령을 노출하는 것입니다.

첫 번째 방법은 Josh Smiths RelayCommand를 사용하는 것이 었습니다. 그래서 그 중 하나를 PersonViewModel에 추가하고 단추에 바인딩했습니다. 작동하지만 문제는 부모 VM이 처리해야하는 이벤트 (명령 실행 후)를 발생시켜야한다는 것입니다. Imho는 좋지 않습니다. 코드가 점점 커지면서 코드가 더러워졌습니다.

그래서 RoutedCommand를 사용하기 위해 모든 작업을 수정하고 컨트롤 계층의 상위 수준에서 CommandBinding을 추가하려고했습니다. 하지만 ControlTemplate이 viewmodel에서 메서드를 호출 할 수 없기 때문에이 방법은 불가능합니다.

그래서이 문제에 대한 올바른 접근 방식이 궁금합니다. 아무 래도 나는 잘못된 길을 가고 있다고 믿지만, 나는 어디 있는지 보지 못한다.

TIA 마틴

답변

2

다시 논리적 트리까지 (또는 커맨드 바인딩) 가능성이 지저분한 경우, DataContext를 걸어 RelativeSource 바인딩을 사용하는 것입니다, 라 작동 나는 짓을했는지 뭔가 :

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}" 
+0

내 주요 모델이 명령을 노출시키지 않아서 내 자식 VM이이를 노출하고 있으므로 내 경우에는 작동하지 않습니다. –

0

MVVM 패턴을 사용하여 이벤트를 전달할 때 Prism’s Event Aggregator이 매우 유용하다는 것을 알았습니다. 느슨하게 결합 된 통신을 처리 할 수 ​​있습니다.

일반적으로 명시적인 관계가없는보기 모델에서 삭제와 같은 이벤트를 전달하려는 경우 하나의보기 모델을 구독하여 특정 이벤트 집계를 찾은 다음 해당 이벤트 집계를 트리거합니다 장소.

나는이 접근법의 몇 가지 변형이있을 것이라고 확신하므로 한 번 볼 가치가있을 것입니다.

+0

imho CommandBindings가 내 목적에 맞게 설계되었으므로 좋은 접근 방식이지만 imho가 더 필요합니다 ... –