programing

MVVM Light Toolkit을 사용하여 새 창을 여는 방법

topblog 2023. 4. 13. 20:28
반응형

MVVM Light Toolkit을 사용하여 새 창을 여는 방법

WPF MVVM 라이트기존 창에서 새 창을 여는 가장 좋은 방법이 무엇인지 알고 싶습니다.은 내가 가지고 있어요.MainViewModel이 되고 있습니다.MainWindow을 사용하다 재,에서MainView버튼 클릭 한 번으로 그 위에 두 번째 창을 열고 싶습니다.에 쥐었다RelayCommmand되어 있다Button의 »Command. 에서에서RelayCommand에서는 새로운 호출할 수 Show() , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

var view2 = new view2()
view2.Show()

Model이 View Model을 하지 않습니다.view2물건.Bugnion이 VIEW MODEL에서 WPF MVVM Get Parent from VIEW MODEL을 읽었습니다.여기서 Bugnion은 메시지를 전달하도록 제안했습니다.view1 viewmodel1 다음에 또 한 번.view1 합니다.view2하지만 그가 실제로 무엇을 의미하는지 잘 모르겠어요.view1? 어떻게 해야 할까요?view1시지지 츠요시에에암 호호, ,? 、 ???

잘 부탁드립니다, 나빌 씨

View Model1에서 View1로 메시지를 전달하는 것은 MVVM Light Toolkit의 메시징 기능을 사용하는 것을 의미합니다.

예를 들어 ViewModel1에는 ShowView2Command라는 명령어가 있을 수 있습니다.이 명령어는 뷰를 표시하기 위한 메시지를 보냅니다.

public class ViewModel1 : ViewModelBase
{
    public RelayCommand ShowView2Command { private set; get; }

    public ViewModel1() : base()
    {
        ShowView2Command = new RelayCommand(ShowView2CommandExecute);
    }

    public void ShowView2CommandExecute()
    {
        Messenger.Default.Send(new NotificationMessage("ShowView2"));
    }
}

View1은 뒤에 있는 코드로 메시지를 수신하도록 등록하고 올바른 메시지를 수신하면 View2를 표시합니다.

public partial class View1 : UserControl
{
    public View1()
    {
        InitializeComponent();
        Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
    }

    private void NotificationMessageReceived(NotificationMessage msg)
    {
        if (msg.Notification == "ShowView2")
        {
            var view2 = new view2();
            view2.Show();
        }
    }
}

당신은 왜 이 길로 갑니까?간단해요.버튼을 토글 버튼, 하이퍼링크 또는 기타 버튼과 같은 컨트롤로 대체하면 "뒤에 코드"를 업데이트할 필요가 없습니다.이것은 MVVM 패턴의 기본 원리입니다.새로운 toggleButton(또는 기타)에서도 동일한 명령어에 바인딩됩니다.

예를 들어, 2개의 UI를 원하는 고객을 위해 프로젝트를 만듭니다. 하나는 프레젠테이션 측면에서 모든 면에서 근본적으로 다릅니다.수평 탭과 수직 RadPanel Bar(Acodion이라고 생각됨)를 비교합니다.두 뷰 모두 동일한 viewModel을 가리킬 수 있습니다. 사용자가 View 1의 Work Order 탭을 클릭하면 패널 바의 Work Order 헤더에서 실행되는 것과 동일한 "Work Order Command"가 실행됩니다.

코드 비하인드 모델에서는 두 개의 개별 이벤트를 코드화해야 합니다.여기 코드 하나만 입력하면 돼요.

또한 Blend를 사용하는 설계자가 원하는 레이아웃을 작성할 수 있습니다.후크(EventToCommand 제어)만 있으면 개발자인 저 자신은 최종 제품이 어떻게 생겼는지 전혀 신경 쓰지 않을 것입니다.

느슨한 커플링은 믿을 수 없을 정도로 강력합니다.

이러한 방법으로 이벤트를 만들고 에 등록한 후 뷰 모델에서 호출할 수 있습니다.팝업창을 열어주세요

Like 이 예

public class Mainclass : MainView
{
    public delegate abc RegisterPopUp(abc A);
    public RegisterPopUp POpUpEvent ;

    public RelayCommand ShowCommand { private set; get; }  


    public void ShowCommand() 
    { 
        ShowCommand("Your parameter");
    } 
}

MainView mn=new MainView();

등록은 Thake와 해 .mn.POpUpEvent +=을 두 번 해 주세요.

그리고 registers 팝업 방식에서는 팝업 창을 여는 코드를 바로 잡습니다.

여기서 요점을 놓치고 있지 않다면 - 뒤에 있는 코드를 사용하는 경우 button_click 이벤트를 직접 구현하여 두 번째 뷰를 여는 것은 어떻습니까?

Bugnion이 제안하는 것은 view1 -> 버튼 클릭 -> 릴레이 명령 -> viewmodel1 -> 메시지 -> view1 -> view1.cs -> open view2 입니다.

어차피 코드 비하인드를 작성하면 테스트성을 희생할 텐데 왜 그렇게 먼 길을 택하는 거죠?

범용 인터페이스를 사용하여 뷰 특정 기능을 서비스로 추상화할 수 있습니다.뷰 레이어에서는 IoC 컨테이너 및 종속성 주입 기술을 사용하여 이러한 서비스의 구체적인 인스턴스를 제공하고 뷰 모델을 빌드할 수 있습니다.

이 경우 인터페이스 IWindowManager 또는 필요한 메서드를 가진 유사한 인터페이스를 구축할 수 있습니다.이는 뷰 레이어에 영향을 줄 수 있습니다.나는 최근 대화 행동을 시야 밖에서 추상화하는 방법을 보여주는 작은 블로그 투고를 썼다.Navigation, MessageBoxes 등 모든 사용자 인터페이스 관련 서비스에 유사한 앱을 사용할 수 있습니다.

이 링크는 http://nileshgule.blogspot.com/2011/05/silverlight-use-dialogservice-to.html에 도움이 될 수 있습니다.

또한 많은 사람들은 view.cs 파일에 등록된 뷰 모델에서 이벤트를 발생시키는 접근 방식을 사용하며, 여기에서 MessageBox 또는 기타 UI 관련 액션이 수행됩니다.개인적으로는 서비스를 주입하는 방식이 마음에 듭니다.그러면 같은 서비스를 여러 번 구현할 수 있기 때문입니다.간단한 예로는 Silverlight 및 Windows Phone 7 응용 프로그램에서 내비게이션이 어떻게 처리되는지를 들 수 있습니다.동일한 뷰 모델을 사용할 수 있지만 애플리케이션 유형에 따라 다른 Navigation 서비스 구현을 주입할 수 있습니다.

View Model에서 창을 열고 닫는 것이 가장 좋은 방법이라고 생각합니다. 링크에서 알 수 있듯이

  1. 작성하다DialogCloser학급
퍼블릭 스태틱클래스 DialogCloser{공용 정적 읽기 전용 DependencyProperty DialogResultProperty = DependencyProperty입니다.RegisterAttached("DialogResult", typeof(bool?), typeof(DialogCloser), new PropertyMetadata(DialogResultChanged);
private static void DialogResultChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var window = d as Window;if(!= null) 창.닫기();}
public static void SetDialogResult(윈도우 타깃, bool?)값){타겟을 설정합니다.SetValue(DialogResultProperty, 값);
}}
  1. 에서 상속되는 Base View Model을 만듭니다.GalaSoft.MvvmLight.ViewModelBase더 많은 멤버들과 함께.완료되면 이 뷰 모델을 다른 뷰 모델의 기준으로 사용합니다.
불?_Windows Flag 닫기;공공부울?윈도 플래그를 닫기{{ return _ close Window Flag ;}을(를) 가져옵니다.세트{_close Window Flag = 값;Raise Property Changed("Close Window Flag");
}}
공개 가상 무효 Close Window(부울)result = true){어플.현재의.디스패처BeginInvoke(DispatcherPriority).배경,새로운 액션() = >{CloseWindowFlag = CloseWindowFlag == null ? true :!CloseWindowFlag;}));
}
  1. 뷰에서 [Bind the Bind](바인드)DialogCloser.DialogResult과의 의존 속성CloseWindowFlag기본 뷰 모델의 속성.

그런 다음 뷰 모델에서 창을 열거나 닫거나 숨길 수 있습니다.

언급URL : https://stackoverflow.com/questions/3386349/how-to-open-a-new-window-using-mvvm-light-toolkit

반응형