2016-12-19 29 views
0

Galasoft Mvvmtoolkitを使用して、wpfでmvvmを実装しました。今私は各ビューの3ビューと1 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

関連する問題