2014-02-14 3 views
4

나는이 질문과 유사한 몇 가지 질문을 알고 있지만 확실한 답을 찾을 수는 없습니다. MVVM을 사용하여 가능한 한 순수하게 유지하려고 노력하지만 패턴을 고수하면서 창을 닫거나 시작하는 방법을 정확히 알지 못합니다.MVVM에서 여러 창을 관리하는 방법

필자의 원래 생각은 ViewModel 트리거링 코드에 대한 데이터 바인딩 명령으로 View의 DataContext가 XAML을 통해 ViewModel로 설정된 새 뷰를 시작하는 것입니다. 하지만 이것은 순수 MVVM을 위반하는 것 같아요 ...

WindowManager (CaliburnMicro에서와 같이)의 개념을 보았습니다. 이제 바닐라 MVVM 프로젝트에서이 중 하나를 구현하면됩니다. 이건 내 ViewModels와 관련이 있습니까? 아니면 내 응용 프로그램의 핵심에 그냥? 현재 내 프로젝트를 Model 어셈블리/프로젝트, ViewModel 어셈블리/프로젝트 및 View 어셈블리/프로젝트로 분리하고 있습니다. 이것이 "코어"어셈블리와 다른 것인가?

MV8에서 내 응용 프로그램을 시작하려면 어떻게해야합니까? 처음에는 App.xaml에서 MainView.xaml을 시작했으며 XAML의 DataContext는 할당 된 ViewModel을 연결합니다. WindowManager을 추가하면 이것이 내 응용 프로그램에 의해 시작되는 첫 번째 것입니까? App.xaml.cs 뒤에있는 코드에서이 작업을 수행합니까?

+0

좋은 질문. 시작을 위해, 나는 보통 app.xaml.cs 코드를 통해 모든 것을 부트 스트랩하지만, 항상 나를 더러운 느낌으로 만듭니다. – hschne

+0

MVVM 스타일의 여러 창을 사용하여이 항목에 대한 최근 [답변] (http://stackoverflow.com/questions/20242817/resolving-wpf-windows-in-structure-map/21763694#21763694)을 볼 수 있습니다. . –

답변

2

글쎄 주로 응용 프로그램이 어떻게 보이는지 (즉, 동시에 열리는 창의 수, 모달 창이 아닌지 등)에 따라 다릅니다.

일반적인 권장 사항은 이 아닙니다. "pure"MVVM을 시도해보십시오. 나는 종종 "Zero code-behind가 있어야한다"는 식으로 읽는다.

현재 프로젝트를 모델 어셈블리/프로젝트 ViewModel 어셈블리/프로젝트와 어셈블리/프로젝트보기로 분리하고 있습니다. 이 경우 을 다른 "Core"어셈블리로 이동해야합니까?

뷰와 뷰 모델을 서로 다른 어셈블리로 분리하면 viewModel에서 뷰와 관련된 내용을 참조하지 않도록 할 수 있습니다. 이처럼 강한 이별로 당신은 잘 될 것입니다.

두 개의 다른 어셈블리를 사용하여 ViewModel과 모델을 분리하는 것도 좋은 생각 일 수 있지만 모델이 어떻게 생겼는지에 달려 있습니다. 필자는 개인적으로 3 계층 아키텍처를 선호하므로 일반적으로 내 모델은 WCF 클라이언트 프록시이며 실제로 자체 어셈블리에 저장됩니다.

"코어"어셈블리는 항상 좋은 생각이지만 (IMHO) 응용 프로그램의 모든 레이어에서 사용할 수있는 기본 유틸리티 메서드를 노출하는 것입니다 (기본 확장 메서드 .... 등). .

조회수 (표시 방법 ... 등)에 대해 지금 은 간단한입니다. 개인적으로 필자는 내 Views의 코드 숨김에서 내 ViewModels을 인스턴스화하는 것을 좋아합니다. 또한 내 ViewModels에 이벤트을 자주 사용하므로 연관된보기가 통보되어 다른보기를 열어야한다고 예를 들어 알립니다.

예를 들어, 시나리오 당신은해야 아이 창을 표시하는 MainWindow를이 때 사용자가 버튼을 클릭 :

// Main viewModel 
public MainViewModel : ViewModelBase 
{ 
    ... 
    // EventArgs<T> inherits from EventArgs and contains a EventArgsData property containing the T instance 
    public event EventHandler<EventArgs<MyPopupViewModel>> ConfirmationRequested; 
    ... 
    // Called when ICommand is executed thanks to RelayCommands 
    public void DoSomething() 
    { 
     if (this.ConfirmationRequested != null) 
     { 
      var vm = new MyPopupViewModel 
      { 
       // Initializes property of "child" viewmodel depending 
       // on the current viewModel state 
      }; 
      this.ConfirmationRequested(this, new EventArgs<MyPopupViewModel>(vm)); 
     } 
    } 
} 
... 
// Main View 
public partial class MainWindow : Window 
{ 
    public public MainWindow() 
    { 
     this.InitializeComponent(); 

     // Instantiates the viewModel here 
     this.ViewModel = new MainViewModel(); 

     // Attaches event handlers 
     this.ViewModel.ConfirmationRequested += (sender, e) => 
     { 
      // Shows the child Window here 
      // Pass the viewModel in the constructor of the Window 
      var myPopup = new PopupWindow(e.EventArgsData); 
      myPopup.Show();   
     }; 
    } 

    public MainViewModel ViewModel { get; private set; } 
} 

// App.xaml, starts MainWindow by setting the StartupUri 
<Application x:Class="XXX.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      ... 
      StartupUri="Views/MainWindow.xaml"> 
+0

코드를 UI의 나머지 부분과 함께 배치해야하므로 효과적으로 UI를 제어하므로 뷰의 코드에서이 작업을 수행하는쪽으로 기울어졌습니다. 그러나 나는 "순수한"코드 비하인드 정신으로 인해 그것을 피했습니다. 이것은 제가 얻을 수있는 대안 답안에 따라 갈 방법이 될 수 있습니다 .. – danbroooks

관련 문제