【问题标题】:Changing View on parent viewmodel from child viewmodel从子视图模型更改父视图模型的视图
【发布时间】:2017-05-04 02:08:43
【问题描述】:

使用 Galasoft Mvvmtoolkit,我在 wpf 中实现了 mvvm。现在我为每个视图创建了 3 个视图和 1 个 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{

}

我想在 Main.xaml 中显示 Detail.xaml 用户控件,其中包含绑定到 CurrentViewModel 的 ContentControl。加载时,我正在其中加载 Info.xaml,并希望在用户单击 Info.xaml 中存在的按钮时显示 Detail.xaml

【问题讨论】:

  • 在类似情况下,this 的回答对理解这个概念很有帮助。

标签: c# wpf xaml mvvm wpftoolkit


【解决方案1】:

以下是对我有用的代码,我没有使用任何工具包。而且我还没有测试过代码。

而 OnClick 方法是用 Command 实现的,你可以使用 CommandParameter 来决定你必须将哪个 viewmodel 设置为 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);
}

【讨论】:

  • 您是否将此 OnClick 绑定到某个按钮?
  • 是的,就是这么说,你可以这样实现。我将为作为 DelegateCommand 的 ClickCommand 实现 CanClick 和 Click 方法,并将该 ClickCommand 绑定到 Button。
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 2018-06-24
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多