2010-07-13 4 views
1

나는 2 형식 Winform 응용 프로그램이 있습니다. 하나의 양식에서 탭 사이를 전환하는 3 개의 탭과 탐색 버튼이있는 탭 컨트롤이 있습니다.MVC/MVP 구현 TabControl .. 디자인 질문에 대한 질문

첫 번째 탭에서 사용자가 파일을 선택하고 첫 번째 탭에서 선택된 파일에 대해 처리를 수행하고 다음 탭으로 이동하려는 경우 세 번째 탭에 결과를 표시합니다.

다른 형태는이 양식 (응용 프로그램을 시작합니다.)를 호출

내가이 사용 MVC/MVP를 할 수 있습니까?

현재 중첩 된 양식을 만들었습니다. 응용 프로그램 양식을 시작하면 탭 양식의 인스턴스가 생성되고에있는 SelectedIndexChanged에 탭 컨트롤이 있고 선택한 탭 속성과 일치합니다. 시작 응용 프로그램 양식에서 처리하고 있습니다. 탭 양식을 닫으면 시작 응용 프로그램에 결과가 설정됩니다. 양식 (이것은 이상적이지 않습니다).

편집 : 또한 각 탭은 내가 탭의 변화를 초기화해야합니다 사용자 정의 컨트롤이 포함되어

간단한 예를이있는 .zip 파일을 선택하는 것입니다 (이전 탭에서 선택한 데이터에 대한 심판을.) 첫 번째 탭에서 다음을 클릭하면 은 zip 파일 내의 파일 목록을 표시하고 세 번째 탭에서는 두 번째 탭에서 선택한 파일 을 사용하여 처리합니다 (예를 들어 같은 것을 수행하는 더 좋은 방법이 있습니다). .)

편집 2 : 기본적으로 컨트롤러를 통해 첫 번째 탭에서 값을 가져 와서 처리하고 컨트롤러를 통해 다음 탭으로 전달하고 컨트롤러를 통해 두 번째 탭에서 사용자 정의 컨트롤 속성을 설정하는 방법에 대해 혼란스러워합니다. 제목이 제거됩니다 .. please see .. Tab 양식은 마법사 양식과 비슷해 보입니다. 그게 내가 SelectedIndexChanged 속성을 사용하는 이유입니다.

기본적으로 Winform에서보기 및 처리 논리를 분리해야합니다.

감사합니다.

답변

1

UI에 이상한 선택입니다. Anyhoo, SelectedIndexChanged가 파일을 처리 할 때까지 기다릴 이유가 없습니다. 파일을 선택하자마자 바로 할 수도 있습니다. 더 잘 작동 할 것이고, 탭 컨트롤이 더 반응하게됩니다. 이벤트가 발생할 때까지 기다리면 UI 스레드가 .zip 파일을 반복하여 사용 중이므로 잠시 동안 컨트롤이 고정됩니다. 사용자는 이것이 바람직하지 않다고 생각하지 않을 것입니다.

MVC 구현이 훨씬 간단 해집니다. 추가 보너스는 이제 더 이상 TabControl에 의존하지 않으며 작업에 가장 적합한 컨트롤을 사용할 수 있다는 것입니다.

+0

사용자가 다른 파일을 선택하면 처리 과정을 다시해야합니까? 다음 버튼/다음 탭을 클릭 할 때까지 처리를 지연하고 싶습니다. 처리는 어디에서 수행해야합니까? 컨트롤러에 이 있습니까? – Amitd

+0

그녀가 그렇지 않다면, 90 %의 경우? 왜 사용자가 세 번째 탭을 클릭해야하는지 알지 못합니다. 자동 선택하면 더 이상 중요하지 않습니다. 아카이브 내부의 파일에 관심이 있다면 일반적으로 모델에서 처리됩니다. 그러나 나는 당신의 모델이 어떻게 생겼는지 모른다. –

+0

기본적으로 MVx 패턴으로 변환하고 싶습니다. 하지만 컨트롤러를 통해 첫 번째 탭에서 값을 가져 오는 방법에 대해 혼란스러워하고 컨트롤러를 통해 다음 탭으로 전달하고 두 번째 탭에서 사용자 정의 컨트롤 속성을 설정합니다. (이 부분을 "Edit2"로 추가했습니다.) – Amitd

1

귀하의 모델은이 경우 귀하의 zip 파일을 처리합니다. 등 PrintCompletedExtractCompleted

당신의 개의 IView 같은 Print() 같은 방법 Extract() 등을 이벤트는 추상 메소드 및 이벤트 인터페이스 뒤에 UI와 상호 작용을 노출됩니다. 그래서 아마도 DisplayFolderContents() 같은 이벤트와 FileSelected() 등의 이벤트가 있습니다.

발표자는 Model 및 IView 이벤트에 연결하고 각 메소드에 대해 호출되는 메소드를 제어합니다. TabControl이있는 양식은 IView 인터페이스의 구현 일뿐입니다. 테스트 용 Mock IView를 포함하여 Presenter에 IView 구현을 주입하면 다른 시각을 가질 수 있습니다.

값은 사용하는 EventArg를 통해 MVP 패턴을 전달할 수 있습니다.

/// <summary> 
/// The event args for a selected file. 
/// </summary> 
public class FileSelectedEventArgs : EventArgs 
{ 
    public string FileName { get; private set; } 

    public FileSelectedEventArgs(string fileName) 
    { 
     this.FileName = fileName; 
    } 
} 

사용자가 파일을 선택

FileSelected 이벤트는 FileSelectedEventArgs에서 사용할 수있는 파일 이름으로,보기에 발생합니다. Presenter는이 이벤트를 수신하고 모델에서 메서드 (예 : ExtractFile(string fileName))를 호출하고 View에서 FileSelectedEventArgs의 fileName을 전달합니다.

발표자는 모델에서 발생시키는 ExtractCompleted 이벤트 (원하는 사용자 정의 eventargs가 있음)를 수신하고보기에서 적절한 메소드를 호출하여 모델의 매개 변수를 전달합니다. 뷰의 메서드는 TabControl 또는 다른 방식으로 데이터를 표시하는 것과 관련하여 원하는대로 할 수 있습니다.

어쨌든이 작업을 수행하는 한 가지 방법 일뿐입니다.