2012-03-30 2 views
1

나는 WPF에 대해 비교적 새롭고 stackoverflow에 익숙하다.전략, 주, 싱글 톤 ... 또는 그 구성?

필자는 패턴과 모범 사례 (여기서는 수많은 게시물뿐만 아니라)의 여섯 권의 책에 머리를 감쌌지만 찾고있는 해결책을 찾을 수없는 것 같습니다.

내 문제점 : WPF/닷넷 4/C 번호 난 편집기로 strored 시간 (AT (유형 문헌 D의) 하나의 문서를로드 (유형 편집기 E의) 텍스트 프로세서가있다. CurrentDocument). 여러 UI 컨트롤은 Document.Title, Document.DateLastModification과 같은 문서 속성 (모든 종속성 속성)에 바인딩됩니다.

이제 모든 이벤트 처리기를 언 후크 및 다시 후킹하지 않고도 실제 Document 인스턴스를 전환 할 수 있기를 바랍니다. 그래서 Editor.CurrentDocument 속성 구현을 전환하는 동안 어떻게 든 인스턴스를 유지해야합니다 같아요.

SingleInstanceDocument 클래스를 만들고 문서에서 직접 상속 받아 Singleton 패턴을 사용하려고했습니다. 그런 다음 모든 속성을 내부적으로 다시 매핑하지 않고도 Document 인스턴스를 SingleInstanceDocument에 삽입 할 수있는 방법을 찾을 수 없습니다.

어떻게 든 잘못되었거나 여기에 요점을 놓치고 있습니까? SingleInstanceDocument 접근 방식이 실행 가능한 솔루션 인 경우 리플렉션을 사용하여 사용 가능한 모든 종속성 속성을 내부 문서에서 외부 SingleInstanceDocument 셸로 자동 매핑 할 수있는 방법이 있습니까?

대단히 감사합니다!

부록는 :

는 여기에 필요한 기능이 이미 를 구현하여 상자 밖으로 WPF/.NET에 의해 제공되었다 것으로 밝혀졌다 CurrentDocument 호스트 오브젝트에을에서 INotifyPropertyChanged. 따라서 현재 문서를 변경하면 UI가 바운드 컨트롤을 적절히 업데이트합니다. 모든 혼란에 빠져서 미안합니다.

+4

잊어 버릴 시간. 패턴은 올바른 패턴을 제공하는 것이 아니라 일을 마무리하는 것입니다. 'SingleInstanceDocument'를 얻는 것의 이득은 무엇입니까? 단 하나만 인스턴스화 할 수 없습니까? – sehe

+0

문제는 내 응용 프로그램이 ORM을 사용하여 편집기가 시작될 때 모든 문서가 이미로드되어 있다는 것입니다. 편집기에서 현재 편집 된 문서를 이미로드 된 인스턴스 중 하나로 전환하려고합니다. – Sebastian

답변

0

먼저 기본 MVVM 패턴을 배웁니다. 기본적으로 WPF-MVVM에서는 ObservableCollection과 INotifyPropertyChanged interface 만 사용합니다.

이 유형의 컬렉션은 현재 항목을 추가/제거하거나 "선택"할 때 UI (보기)에 업데이트를 알리는 관찰자 패턴을 구현합니다.

//in main ViewModel 
private Ducument _currentDocument; 

public Document CurrentDocument 
{ 
    get { return _currentDocument; } 
    set 
    { 
     _currentDocument = value; 
     NotifyPropertyChanged("CurrentDocument"); 
    } 
} 

//stored all loaded documents as collection. 
public ObservableCollection<Document> Documents { get; set; } 

바인딩 - 현재 항목.

<ListBox ItemsSource="{Binding Path=Documents}" SelectedItem="{Binding Path=CurrentDocument}" DisplayMemberPath="Title"> 
    <!-- //all Document.Title as listitem --> 
</ListBox> 
<!--// Editor's View --> 
<ContentControl DataContext="{Binding Path=CurrentDocument}"></ContentControl>