이를 수행하는 두 가지 좋은 방법이 있습니다. 1) 대화 서비스 (쉽고 깨끗함)와 2)보기 지원. View Assisted는 몇 가지 깔끔한 기능을 제공하지만 일반적으로 가치가 없습니다.
대화 서비스
a) 생성자 또는 일부 종속성 컨테이너와 같은 대화 서비스 인터페이스 :
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) IDialogService를 구현하면 창을 열거 나 (또는 일부 제어를 활성 창에 주입) 주어진 dlgVm 유형의 이름 (컨테이너 등록 또는 규칙 사용 또는 DataTemplate과 관련된 ContentPresenter 사용)을 작성해야합니다. ShowDialogAsync는 TaskCompletionSource를 생성하고 .Task 속성을 반환해야합니다. DialogViewModel 클래스 자체는 닫으려고 할 때 파생 클래스에서 호출 할 수있는 이벤트가 필요하며 대화 상자보기에서 실제로 대화 상자를 닫거나 숨기고 TaskCompletionSource를 완료하는 것을 볼 수 있습니다.
b) 사용하려면 DialogViewModel 파생 클래스의 인스턴스에서 await this.DialogService.ShowDialog (myDlgVm)를 호출하십시오. 대기 상태로 돌아간 후 대화 VM에서 추가 한 속성을보고 무슨 일이 있었는지 확인하십시오. 콜백이 필요하지 않습니다.
지원보기
뷰 모델의 이벤트를 듣는 뷰가 있습니다. 이것은 기울어 진 코드와 리소스 사용을 피하기 위해 블렌드 비헤이비어로 모두 묶을 수 있습니다 (FMI, 스테로이드에 일종의 블렌딩 가능한 속성을보기 위해 "비헤이비어"클래스를 서브 클래 싱). 지금은 각보기에서 수동으로 수행합니다.
a) 커스텀 페이로드 (DialogViewModel 파생 클래스)로 OpenXXXXXDialogEvent를 만듭니다.
b) 뷰가 OnDataContextChanged 이벤트에서 이벤트를 구독하도록합니다. 이전 값! = null이고 Window의 Unloaded 이벤트에서 숨기거나 구독 취소해야합니다.
c) 이벤트가 발생하면 페이지의 리소스에있을 수있는보기가 열리도록하거나 대화 상자 서비스 접근 방식과 같이 다른 곳에서 규칙을 통해 찾을 수 있습니다.
이 방법은 더 유연하지만 더 많은 작업이 필요합니다. 많이 사용하지 않습니다. 한 가지 좋은 장점은 예를 들어보기를 실제로 탭 안에 배치 할 수 있다는 것입니다. 알고리즘을 사용하여 현재 사용자 컨트롤의 경계에 배치하거나 충분히 크지 않은 경우 큰 컨테이너가 발견 될 때까지 시각적 트리를 탐색합니다.
이를 통해 대화 상자는 실제 사용되는 장소에 가깝게 접근 할 수 있으며 현재 활동과 관련된 앱의 일부만 어둡게하고 사용자가 대화 상자를 수동으로 밀지 않고도 앱 내에서 이동할 수 있습니다. 모달 대화 상자가 다른 탭 또는 하위보기에서 열립니다.