2017-11-03 28 views
0

私はMVVMを初めて使用しています。私はこの芸術品を見つけ、それが問題の私のハーフを解決する。WPF MVVMユーザーコントロール間の切り替え

https://social.technet.microsoft.com/wiki/contents/articles/30898.simple-navigation-technique-in-wpf-using-mvvm.aspx

しかし、私は1人のユーザーコントロールのボタンクリックイベントからではなく、メインウィンドウ上のボタンから別のUserControlから移動する必要があります。

のUserControl 1:

enter image description here

ユーザーコントロール2:

enter image description here

これは私がSOFARしようとしたものです。

class Usercontrol1ViewModel : INotifyPropertyChanged 
{ 
    public ICommand navCommand { get; set; } 


    public Usercontrol1ViewModel() 
    { 
     navCommand = new BaseCommand(navigate); 
    } 

    private void navigate(object obj) 
    { 
     NavigationViewModel mainViewModel = new NavigationViewModel(); 
     mainViewModel.SelectedViewModel = new Usercontrol2ViewModel(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

NavigationViewモデルクラス

Class NavigationViewModel : INotifyPropertyChanged 
{ 

    public ICommand btn1Command { get; set; } 

    public ICommand btn2Command { get; set; } 

    private object selectedViewModel; 

    public object SelectedViewModel 

    { 

     get { return selectedViewModel; } 

     set { selectedViewModel = value; OnPropertyChanged("SelectedViewModel"); } 

    } 



    public NavigationViewModel() 
    { 

     btn1Command = new BaseCommand(Opencontrl1); 

     btn2Command = new BaseCommand(Opencontrl2); 

    } 

    private void Opencontrl1(object obj) 
    { 

     SelectedViewModel = new Usercontrol1ViewModel(); 

    } 

    private void Opencontrl2(object obj) 
    { 

     SelectedViewModel = new Usercontrol2ViewModel(); 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propName) 
    { 

     if (PropertyChanged != null) 

     { 

      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 

     } 

    } 

} 

の背後にあるメインウィンドウのコード。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new NavigationViewModel(); 
    } 
} 

誰かがMVVMでこれを達成するためにどのように私を導くことはできますか?

+0

私は私のコードを変更しました。それは間違っていた – Newbie

答えて

2

次のコードを試してください。私は資料のサンプルコードを使用して、私は

class NavigationViewModel : INotifyPropertyChanged 
{ 
    public EmployeeViewModel EmployeeViewModel { get; set; } 
    public DepartmentViewModel DepartmentViewModel { get; set; } 

    private object selectedViewModel; 

    public object SelectedViewModel 
    { 
     get { return selectedViewModel; } 
     set { selectedViewModel = value; OnPropertyChanged("SelectedViewModel"); } 
    } 


    public NavigationViewModel() 
    { 
     SelectedViewModel = new EmployeeViewModel(OpenEmp); 
    } 

    private void OpenEmp(object obj) 
    { 
     if (obj.ToString() == "Dept") 
     { 
      SelectedViewModel = new DepartmentViewModel(); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 
をNavigationViewModel MSDNの記事:)

MainWindow.xaml

<Window.Resources>  
    <DataTemplate DataType="{x:Type local:EmployeeViewModel}"> 
     <local:EmployeeView/> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type local:DepartmentViewModel}"> 
     <local:DepartmentView/> 
    </DataTemplate> 
</Window.Resources> 
<DockPanel LastChildFill="True">    
    <ContentControl x:Name="Pages" DockPanel.Dock="Right" Content="{Binding SelectedViewModel}"/> 
</DockPanel> 

の作者です

社員ビュー

<Grid> 
    <StackPanel> 
     <TextBlock Text="This is employee view"/> 
     <Button Content="Navigate to Dept View" Command="{Binding Navigate}"/> 
    </StackPanel> 
</Grid> 

EmployeeViewModel

class EmployeeViewModel 
{ 
    private readonly Action<object> navigate; 

    public ICommand Navigate { get; set; } 
    public EmployeeViewModel(Action<object> navigate) 
    { 
     Navigate = new BaseCommand(OnNavigate); 
     this.navigate = navigate; 
    } 

    private void OnNavigate(object obj) 
    { 
     navigate.Invoke("Dept"); 
    } 
} 
+0

あなたは私の日を救った。どうもありがとうございました。ただし、このクリックイベントは1回だけ機能します。毎回このクリックイベントを処理するためにどこを変更する必要がありますか? – Newbie

関連する問題