2012-02-29 3 views
0

ViewModel에 컬렉션이 변경되었음을 알리려면 View의 코드 숨김 파일에서 별도의 ViewModel으로 메시지를 보내려고합니다. 코드 비하인드 파일 사용이 MVVM 원칙을 어기는 것을 이해 합니다만,이 상황에서 정당화된다고 생각합니다.코드 숨김 파일과 ViewModel 간의 통신 방법

나는 내가 사용해야하는 WindowsForms 컨트롤을 가지고 있으므로 내 응용 프로그램에 WindowsFormsHost이 필요합니다. WindowsFormsHost은 코드 숨김 파일에 있습니다. 여기서는 내 WindowsForms 컨트롤 (비디오 캡처 컨트롤입니다)을 설정하기위한 모든 기초 작업을하고 있습니다.

별도의 View/ViewModel이이 컨트롤로 캡처 한 비디오 및 이미지를 처리합니다. 애플리케이션의 시작에서 ViewModel은 모델에 모든 이미지/비디오 축소판을 검색하도록 요청한 다음 사용자가 볼 수 있도록 뷰의 ListBox에 배치합니다. 여기 내가 잃어버린 곳이있다.

ViewModel과 통신하여 새 이미지/비디오가 캡처되고보기가 업데이트되어야합니다. 축소판 목록을 이미 ObservableCollection으로 설정하고 OnPropertyChangedNotifyCollectionChanged 이벤트를 설정했습니다.

이 실행되면이 실행됩니다. 나는 그들이 그렇게하지 않는다고 말했기 때문에 그들이 결코 존재하지 않는다는 것을 알아 차렸다. 파일을 성공적으로 저장 한 후에 발생하는 event을 설정하려고했지만 파일 저장이 다른 클래스 (캡처 컨트롤에서 요구하는 콜백 클래스)에 참여하므로이 클래스의 인스턴스가 필요합니다. 내 ViewModel에서 이벤트를 구독합니다.

즉, 파일 저장을 수행하는 클래스의 인스턴스가 아닌 ViewModel에 다른 인스턴스를 만들어야한다는 뜻입니다. UI 단추를 누른 후 코드 숨김 파일과 이미지/비디오 ViewModel간에 통신 할 수있는 방법이 있습니까?

기본적으로 작업의 내 원하는 순서는 다음과 같은 수 있습니다 :

1) 사용자가 응용 프로그램을 열고 하나 개의 창에서 비디오 스트림을보고 다른 이미 캡처 한 이미지/동영상 썸네일이 (이 두 개의 별도에 저장됩니다 지금은 솔루션 디렉토리 안의 폴더)

2.) 사용자는 "비디오 캡처"또는 "스틸 이미지"버튼을 클릭하여 비디오 캡처를 시작하거나 현재 비디오 프레임의 이미지를 찍습니다.

3.) 비디오 캡처를 클릭하면 비디오 캡처를 중지하려면 "중지"를 클릭해야합니다. 비디오는 비디오 폴더에 저장됩니다.

4.) "Still Image"를 클릭하면 프레임이 캡처되어 "images"폴더에 저장됩니다. 캡쳐 한 후 프레임의 BitmapImage을 만듭니다.

5. ImageViewModel에 저장된 새 이미지/비디오가 있다는 알림을 받아야하며 캡처 한 이미지/비디오 창을 업데이트해야합니다.

이것은 이벤트에 대한 완벽한 상황처럼 들리지만, 클래스의 추가 인스턴스를 만들지 않고 제대로 연결하는 방법을 생각할 수 없습니다. 일부 코드 예제가 도움이 될 경우 알려 주시기 바랍니다.

+0

"파일을 성공적으로 저장 한 후"에 대해 이야기하기 전까지 귀하의 질문에 답하고있었습니다. 이전 설명과 어떤 관련이 있는지 보지 못했습니다. 원하는 작업 순서를 나열 할 수 있습니까 (가능한 경우 목록 서식 지정 사용)? – Justin

+0

죄송합니다. 서식에주의를 기울이지 않았습니다. 사과드립니다. 다음에 그걸 메모 할게. @ 재 스틴, 네, 편집하고 할 것입니다. – Zajn

+0

무엇? 처음에는 View에 ViewModel이 알아야 할 컬렉션이있는 것처럼 들렸습니다. 그런 다음 파일 저장에 대해 이야기하기 시작했습니다. 보기가 그렇게하고 있습니까? 몇 가지 코드를 게시하면 무엇을 요구하는지 이해하는 것이 더 쉬울 수도 있습니다. – cadrell0

답변

0

event aggregator 패턴을 사용할 수 있습니다. Prism 및 Caliburn.Micro와 같은 MVVM 프레임 워크에 이러한 구현이 포함되어 있습니다. Caliburn.Micro에는 이벤트 수집기 만 포함 된 NuGet 패키지가 포함되어 있으므로 전체 프레임 워크를 내려야 할 필요가 없습니다.

문서를 보려면 http://nuget.org/packages/Caliburn.Micro.EventAggregatorhere을보십시오.

이벤트 게시는 코드 숨김에서 발생할 수 있으며 구독자는 이벤트에 응답하는보기 모델이됩니다.

+0

응답 해 주셔서 감사합니다. 그것은 유망 해 보인다. 나는 그것을 들여다보고 내 문제를 해결할 수 있는지 알아볼 것입니다. – Zajn