WPF(MVVM):보기 모델에서 보기를 닫으시겠습니까?
MVVM을 사용하여 뷰 모델에서 뷰를 닫는 영리한 방법을 발견한 사람이 있습니까?
바인딩을 사용하여 보기(창)를 닫으라는 신호를 보내는 방법이 있습니까?
누구든 의견을 주시면 정말 감사하겠습니다.
기본적으로 loginViewModel에 바인딩된 loginView가 있습니다. viewmodel(명령에 바인딩 사용)에서 로그인이 성공적인지 확인하고 성공적인지 여부를 테스트합니다. 기본적으로 새 View(메인 뷰)를 로드하고 해당 데이터 컨텍스트를 첨부합니다.
하지만 여전히 loginView가 표시되어 있으므로 언로드하라는 신호를 보내야 합니다.
저는 또한 일반적인 해결책을 기대하고 있었습니다. 왜냐하면 저는 다른 상황에서 이런 종류의 일을 해야 할 것이라고 확신하기 때문입니다.
아이디어 있어요?
편집: 자세한 설명은 제 블로그 게시물을 참조하십시오.
필요할 때는 제가 만든 IRquest CloseView Model 인터페이스를 사용합니다.
이 인터페이스에는 RequestClose 이벤트가 하나만 포함되어 있습니다.이 이벤트는 ViewModel(ViewModelBase 클래스에서 상속되고 IRequestCloseViewModel을 구현하는 ViewModel)이 관련 뷰를 닫으려고 할 때 발생합니다.
내 앱에서 모든 창은 추상 클래스 응용 프로그램 창에서 상속됩니다.이 추상 클래스는 DataContext가 변경될 때마다 알려지며 처리기에서 DataContext가 IRquestCloseView 모델을 지원하는지 여부를 확인합니다.이 경우 이벤트가 발생할 때 창을 닫도록 이벤트 핸들러가 설정됩니다.
또는 Kent가 말했듯이 외부 클래스에서 이 메커니즘을 처리하는 화면 컨트롤러를 사용할 수 있습니다.
어떤 MVVM 프레임워크를 사용하고 있는지는 잘 모르겠지만, 대부분은 전송된 메시지에 등록하기 쉬운 일종의 메시징/알림 솔루션을 포함하고 있습니다."WindowsBoundTo 닫기" 및 viewModel을 보낸 사람으로 표시하는 등의 메시지에 대해 귀하의 보기를 등록할 수 없다고 생각할 이유가 없습니다.그런 다음 해당 메시지를 등록하고 현재 데이터 컨텍스트를 발신인과 비교할 수 있습니다.일치하는 경우 창을 닫습니다.
단순하며 뷰 모델에서 뷰를 추상화합니다.
MVVM-light 툴킷을 사용한 접근 방식은 다음과 같습니다.
뷰 모델에서:
public void notifyWindowToClose()
{
Messenger.Default.Send<NotificationMessage>(
new NotificationMessage(this, "CloseWindowsBoundToMe")
);
}
보기에서:
Messenger.Default.Register<NotificationMessage>(this, (nm) =>
{
if (nm.Notification == "CloseWindowsBoundToMe")
{
if (nm.Sender == this.DataContext)
this.Close();
}
});
예전에는 대화 상자 닫기 첨부 동작을 사용했지만, 아래 솔루션을 사용하는 것이 더 쉽다고 생각이 듭니다.아래 샘플은 단순화를 위해 창에서 닫기 단추의 예를 보여줍니다.
창을 명령 매개 변수로 전달합니다.
보기에 대한 xaml 버튼:
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
뷰 모델에서 명령 실행 방법:
if (parameter is System.Windows.Window)
{
(parameter as System.Windows.Window).Close();
}
일반적으로 화면 활성화/비활성화를 위해 일종의 컨트롤러/프레젠터/서비스를 사용합니다. MVVM은 모든 것을 규칙화하는 단일 패턴이 아닙니다.단순하지 않은 응용프로그램에서 다른 패턴과 결합해야 합니다.
하지만,에서는 아이 뷰. 일부 상 황 에 서 즉 하 뷰 모 주 관 있 의 니 습 것 다 가 미 이 는 하 사 용 을 모 리 하 뷰 델 는 기 를 위 델 는 명 수 의 ▁that ▁makes 즉 ▁view 다 니 , 일 있 습 ▁a ▁in 부 ▁situ , ▁models ▁model ▁some ▁that ▁to ▁sense ▁the예를 들어, 당신은 다음이 있을 수 있습니다.EditorViewModel편집 중인 각 문서에 대해 하나씩 하위 보기 모델의 집합을 관리합니다.이 경우 이 컬렉션에 추가/제거하기만 하면 보기가 활성화/비활성화될 수 있습니다.하지만 이것은 당신의 사용 사례에 맞지 않는 것처럼 들립니다.
http://adammills.wordpress.com/2009/07/01/window-close-from-xaml/
<Style.Triggers> <DataTrigger Binding="{Binding CloseSignal}" Value="true"> <Setter Property="Behaviours:WindowCloseBehaviour.Close" Value="true" /> </DataTrigger> </Style>
창에 부착하는 명령을 만들 수 있으며 실행하면 창이 닫힙니다.그런 다음 해당 명령을 뷰 모델의 속성에 바인딩하고 창을 닫을 때 명령을 실행할 수 있습니다.
LoginView 모델을 인스턴스화하고 LoginView를 표시하는 Application Controller를 사용합니다.사용자가 로그인 화면을 계속하면 Application Controller가 LoginView를 닫고 MainView Model과 함께 MainView를 표시합니다.
WPF(WPF 적용) Framework) 프로젝트의 샘플 응용 프로그램에 이러한 방법이 나와 있습니다.
이 답변은 이를 위한 또 다른 방법을 보여줍니다.
연결된 속성을 사용하여 DialogResult 창 속성을 ViewModel 속성에 바인딩합니다.DialogResult 값을 true 또는 false로 설정하면 보기가 닫힙니다.
코드 뒤에 있는 EventHandler를 닫고 명령 바인딩을 사용할 수 있는 뷰 모델의 다른 모든 항목을 처리합니다.
이벤트를 사용하여 이 작업을 수행할 수도 있습니다.뷰 코드 뒤에 3줄의 코드가 필요하지만(일부 MVVM 순수주의자들은 이를 좋아하지 않습니다);
뷰 모델에서 뷰가 구독할 수 있는 이벤트를 만듭니다.
public event CloseEventHandler Closing;
public delegate void CloseEventHandler();
private void RaiseClose()
{
if (Closing != null)
Closing();
}
에서 아래와 같이 구성 요소 초기화 방법 후 이벤트에 가입하는 방법을 확인할 수 있습니다.
public View
{
*//The event can be put in an interface to avoid direct dependence of the view on the viewmodel. So below becomes
//ICloseView model = (ICloseView)this.DataContext;*
ProgressWindowViewModel model = (ProgressWindowViewModel)this.DataContext;
model.Closing += Model_Closing;
}
private void Model_Closing()
{
this.Close();
}
뷰 모델에서 뷰를 닫을 준비가 되면 RaiseClose()를 호출하기만 하면 됩니다.
이 방법을 사용하여 보기 모델에서 보기로 메시지를 보낼 수도 있습니다.
이벤트는 뷰 모델에 대한 뷰의 직접적인 종속성을 방지하기 위해 인터페이스에 배치할 수 있습니다.
보기 모델에서 보기를 닫기 위해 여기에서 다운로드할 수 있는 Galasoft MVVM Light Toolkit을 사용했습니다. http://www.mvvmlight.net/
다음과 같은 클래스 생성: 공용 클래스 닫기 요청: MessageBase {}
뷰 생성자에 추가합니다.메신저.체납.등록(이것, vm, msg=> 닫기();
창을 닫으려면 다음을 호출합니다.메신저.체납.전송(새 마감 요청(), 이);
언급URL : https://stackoverflow.com/questions/1484233/wpf-mvvm-closing-a-view-from-viewmodel
'programing' 카테고리의 다른 글
| 호를 사용하여 세터 재정의 (0) | 2023.06.03 |
|---|---|
| 용기 크기를 기준으로 글꼴 크기 조정 (0) | 2023.06.03 |
| "chore"를 커밋 메시지 유형으로 사용할 때는 언제입니까? (0) | 2023.05.29 |
| 오류: Postgres를 사용하여 시퀀스 city_id_seq에 대한 사용 권한이 거부되었습니다. (0) | 2023.05.29 |
| 함수를 사용하여 가장 가까운 분과 가장 가까운 시간으로 반올림된 T-SQL 날짜 시간 (0) | 2023.05.29 |