2014-11-14 5 views
1

저는 WPF 개발에 새로운 경험이 있으며 현재 응용 프로그램 개발에 MVVM을 사용하려고합니다. MVVM 탐색 및보기 전환에 대해 많이 읽었지만 현재 상황에 대한 솔루션을 찾을 수 없습니다. 의 그것이 무엇인지 설명하자 모두의 첫째, 나는 내 주요보기, 고정 된 영역과 요소를하는 Dockpanel, 콘텐츠가 행동에 따라 변경해야합니다 주 "동적"영역이 있습니다탐색/WPF/MVVM에서 다른보기로드

<DockPanel> 
    <Label Content="Top Fixed element"/> 
    <StackPanel Orientation="Vertical" Height="auto" Width="150" DockPanel.Dock="Left"> 
     <Label Content="SomeOptions"/> 
     <!-- some more elements --> 
    </StackPanel> 
    <Label DockPanel.Dock="Bottom" Content="Foot"/>   
    <ContentControl Content="{Binding CurrentMainViewElementViewModel}"/>   
</DockPanel> 

을 나는이 ContentControl을에로드하고 싶은 몇 가지 DataTemplates을 정의, 여기에 데이터 템플릿 중 하나가 예를 들어 :

<Window.Resources> 
    <DataTemplate DataType="{x:Type ViewModel:FileLoaderVM}"> 
     <View:FileLoaderView/> 
    </DataTemplate> 
</Window.Resources> 

이 FileLoader (보기 및보기 모델은 RelayCommand과에서 INotifyPropertyChanged를 사용하여 구현) 버튼을 클릭하면 대화 상자가 열립니다. 버튼을 클릭하면 파일이 열리고 파싱 된 후 sh (이 경우에는 데이터가있는 사람). 지금하고 싶은 일은 버튼을 클릭하면이 ContentControl에 다른 사용자 정의 컨트롤을로드하는 것입니다. 이 버튼은 다음과 같이 내보기 모델에 정의되어

public ICommand LoadPersons 
    { 
     get { return new RelayCommand(param => this.loadSelectedPersons(), param => (SelectedPersons!=null && SelectedPersons.Any()));} 
    } 

내 질문이 시점에서 온다, 내가보기 모델에서 직접 현재 대신 다른 사용자 컨트롤을로드의 ContentControl을의 내용을 수정하는 방법 (이 "this.loadSelectedPersons()")에서? 이것이 가능하지 않은 경우이 문제를 해결하기 위해 어떻게 접근해야합니까? 이 작업 옆에 이전에 선택된 요소를 모두 표시하고 가능한 다른 방법으로 조작 (DB에 삽입, 다른 파일 저장 등)하고 싶습니다. 이미 적절한 사용자 정의 컨트롤을 사용하고 있습니다. ContentControl 섹션의 기본보기 요소에 표시하고 다른 요소는 그대로 유지합니다.

+0

속성에 액세스 할 때마다 새 ICommand를 반환합니까? 그건 전혀 옳지 않습니다. – Will

답변

1

나는 당신이 옳은지 알아 봅니다.

ContentControl에 바인딩 된 (CurrentMainViewElementViewModel) 속성이있는 mainviewmodel이 있습니다. MainView 모델은 FileLoaderVM을이 속성으로 설정합니다. 이제 파일이 FileLoaderVM에서 선택 될 때 "새로운/다른"ViewModel을 표시하고 싶습니까?

왜 FileLoaderVM에서 이벤트를 노출하고 MainViewModel에서이 이벤트를 구독하지 않으십니까? 당신은 그래서 당신의 MainViewModel 그 다음은 ContentControl에 "다른/새로운"뷰 모델을 설정할 수 있습니다 경우

+0

귀하의 해결책은 저에게 도움이되었습니다. 귀하의 답에 감사드립니다. – estradjs

1

부하 다른 사용자 제어하지 않습니다 만, (ContentControl.Content가 결합되는) CurrentMainViewElementViewModel의 변화 값 ContentControl의 내용을 변경하려면 새로운 UserControl (DataTemplate과 같은 방법으로 FileLoaderVM이 정의 됨)을로드 할 새로운 ViewModel에 연결하십시오.

이것은 주된 ViewModel (CurrentMainViewElementViewModel이있는 곳)에서 일하는 것처럼 보입니다.

쉬운 해결책은 뷰 모델

public Switch() 
{ 
    CurrentMainViewElementViewModel = SomeViewModel; 
} 

시키는 방법을 제공 FileLoaderVM에서이 방법을 호출한다.