2016-12-19 3 views
0

Galasoft Mvvmtoolkit을 사용하여 wpf에서 mvvm을 구현했습니다. 이제 각 뷰에 대해 3 개의 뷰와 1 개의 ViewModel을 만들었습니다. 아래는 샘플 코드입니다.자식 viewmodel에서 부모 viewmodel보기 변경

//For Main.xaml 
public MainViewModel:ViewModelBase 
{ 
    ViewModelBase CurrentView{get;set;} 

    public MainViewModel(){ 
     CurrentViewModel = new InfoViewModel(); 
    } 
} 

//For Info.xaml 
public InfoViewModel{ 
    //Open DetailViewMode by setting 
    //CurrentViewModel property to an instance of DetailViewModel 
    ICommand ShowDetailCommand; 

    public InfoViewModel(){ 
      ShowDetailCommand = new RelayCommand(()=>{ 
      //CurrentViewModel= new DetailViewModel(); 
      }) 
    } 
} 

//For Detail.xaml 
public DetailViewModel{ 

} 

나는 CurrentViewModel에 바인더 제본 그 안에 ContentControl을있다 Main.xaml에서 Detail.xaml의 UserControl을 보여주고 싶은. 로드시 Info.xaml을로드하고 사용자가 Info.xaml에있는 버튼을 클릭 할 때 Detail.xaml을 표시하려고합니다.

+0

유사한 시나리오에서 [this] (http://stackoverflow.com/a/19654812/2819451) 대답은 개념을 이해하는 데 많은 도움이되었습니다. – Gopichandar

답변

0

아래 코드는 저에게 한 번 사용되었지만 사용되지 않았습니다. 툴킷. 나는 코드를 테스트하지 않았다.

Command로 구현 된 OnClick 메서드 및 CommandParameter를 사용하여 currentviewmodel로 설정해야하는 뷰 모델을 결정할 수 있습니다.

public class ViewModelLocator : ViewModelBase 
{ 
    private static RegularViewModel _regularViewModel; 

    public static RegularViewModel RegularViewModel 
    { 
     get 
     { 
      if (_regularViewModel == null) 
      { 
       _regularViewModel = new RegularViewModel(MainViewModel); 
      } 
      return 
       _regularViewModel; 
     } 
     set { _regularViewModel = value; } 
    } 

    private static AdvancedViewModel _advancedViewModel; 

    public static AdvancedViewModel AdvancedViewModel 
    { 
     get 
     { 
      if (_advancedViewModel == null) 
      { 
       _advancedViewModel = new AdvancedViewModel(MainViewModel); 
      } 
      return 
       _advancedViewModel; 
     } 
     set { _advancedViewModel = value; } 
    } 

    private static MainViewModel _mainViewModel; 

    public static MainViewModel MainViewModel 
    { 
     get 
     { 
      if (_mainViewModel == null) 
      { 
       _mainViewModel = new MainViewModel(); 
       _mainViewModel.ViewModels.Add(RegularViewModel); 
       _mainViewModel.ViewModels.Add(AdvancedViewModel); 
      } 
      return 
       _mainViewModel; 
     } 
     set { _mainViewModel = value; } 
    } 


} 

public class MainViewModel : ViewModelBase, INaviagte 
{ 

    private ObservableCollection<ViewModelBase> viewModels; 

    public ObservableCollection<ViewModelBase> ViewModels 
    { 
     get { return viewModels; } 
     set { viewModels = value; } 
    } 

    private ViewModelBase selectedViewModel; 

    public ViewModelBase SelectedViewModel 
    { 
     get { return selectedViewModel; } 
     set { selectedViewModel = value; } 
    } 
    public MainViewModel() 
    { 
     ViewModels = new ObservableCollection<ViewModelBase>(); 
    } 

    private bool showCompactView; 

    public bool ShowCompactView 
    { 
     get { return showCompactView; } 
     set { showCompactView = value;RaisePropertyChanged("ShowCompactView"); } 
    } 

    public void Navigate(ViewModelBase _viewModel) 
    { 
     SelectedViewModel = _viewModel; 
    } 

} 

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    internal void RaisePropertyChanged(string v) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(v)); 
    } 

} 
public class RegularViewModel : ViewModelBase 
{ 
    INaviagte mainViewModel; 
    public RegularViewModel(INaviagte _mainViewModel) 
    { 
     mainViewModel = _mainViewModel; 
    } 
    public RegularViewModel() 
    { 

    } 
    private void OnClick(object obj) 
    { 
     mainViewModel.Navigate(ViewModelLocator.AdvancedViewModel); 
    } 
} 
public class AdvancedViewModel : ViewModelBase 
{ 
    INaviagte mainViewModel; 
    public AdvancedViewModel(INaviagte _mainViewModel) 
    { 
     mainViewModel = _mainViewModel; 
    } 
    public AdvancedViewModel() 
    { 

    } 

    private void OnClick(object obj) 
    { 
     mainViewModel.Navigate(ViewModelLocator.RegularViewModel); 
    } 
} 

public interface INaviagte 
{ 
    void Navigate(ViewModelBase _viewModel); 
} 
+0

이 OnClick을 일부 버튼에 바인딩하고 있습니까? –

+0

예, 그냥 그렇게 구현할 수 있습니다. DelegateCommand 인 ClickCommand에 대해 CanClick 및 Click 메서드를 구현하고 해당 ClickCommand를 Button에 바인딩합니다. – WPFUser