2017-04-23 22 views
-1

我有一种情况,我不确定是否正确。孩子ViewModel应该能够改变父ViewModel?

我有一个ApplicationViewModel这是我的整个应用程序的“壳”。

而在该viewmodel我有其他child-ViewModels。

public ApplicationModelView() 
    { 
     ModelViewPages.Add(new GameViewModel()); 
     ModelViewPages.Add(new EditGameViewModel()); 
     //Set Current HomePage 
     CurrentPage = ModelViewPages[0]; 
    } 
    #endregion 

    #region Properties 
    public BaseModelView CurrentPage 
    { 
     get { return _currentPage; } 
     set { _currentPage = value; OnPropertyChanged(); } 
    } 
    public List<BaseModelView> ModelViewPages 
    { 
     get 
     { 
      if (_modelViewPages == null){_modelViewPages = new List<BaseModelView>();} 
      return _modelViewPages; 
     }       
    } 
    #endregion 

在我我从包含标题我的模型GamesModel,描述等显示对象的列表

当我点击这个列表中的项目它也选择了,然后我想改变我用按钮查看EditGameViewModel,但我不确定如何去做。

如何让我的child-ViewModel更改我的父视图模型中的内容? 或者孩子应该这样做吗?

编辑

How I want it to function

当我选择一个项目,然后点击按钮,我从视图更改为EditGameViewModel与我从列表中选择的数据我想要的。

public void EditGame(object param) 
    { 
     //MessageBox.Show("From EditGame Function"); HERE I WANT TO CHANGE THE VIEWMODEL ON MY APPLICATIONVIEWMODEL 
    } 
    public bool CanEditGame(object param) 
    {    
     return SelectedGame != null; 
    } 
+0

只是为了澄清:您希望显示GamesModel列表的面板/视图完全被所选EditGameViewModel的面板/视图替换?或者,您是否只想将单个选定项目的视图更改为GamesModel列表视图中的EditGameViewModel项目视图(基于您的简短代码示例,我相信这一点)?不幸的是,你的涂鸦对于解释你真正想要做什么不是很有帮助...... – elgonzo

+0

@elgonzo添加了一张照片,希望能够解释更多我想要的内容。但我想用EditGameViewModel替换GamesModel列表并显示该视图。 – tutu

+0

我明白了。你已经知道如何使用WPF中的命令? (命令对于将这种交互逻辑与你的视图模型“弱”联系起来是至关重要的) – elgonzo

回答

0

我可以提供一些有用的东西,但可能有问题。这一切都取决于你如何计划你的应用程序的功能。

首先,类似于您MainViewModel,你想是这样的:

public class MainViewModel : ObservableObject //ObservableObject being a property change notification parent 
{ 
    //Current view will always be here 
    public BaseViewModel ViewModel { get; set; } 

    public MainViewModel() 
    { 
     //By default we will say this is out startup view 
     Navigate<RedViewModel>(new RedViewModel(this)); 
    } 

    public void Navigate<T>(BaseViewModel viewModel) where T : BaseViewModel 
    { 
     ViewModel = viewModel as T; 
     Console.WriteLine(ViewModel.GetType()); 
     OnPropertyChanged("ViewModel"); 
    } 
} 

现在,因为我们正在导航这样,每个孩子视图需要从BaseViewModel派生。

public class BaseViewModel : ObservableObject 
{ 
    private MainViewModel _mainVM; 

    public BaseViewModel(MainViewModel mainVM) 
    { 
     _mainVM = mainVM; 
    } 

    protected void Navigate<T>() where T : BaseViewModel 
    { 
     //Create new instance of generic type(i.e. Type of view model passed) 
     T newVM = (T)Activator.CreateInstance(typeof(T), _mainVM); 
     //Change MainViewModels ViewModel to the new instance 
     _mainVM.Navigate<T>(newVM); 
    } 
} 

现在我们真的需要看看我们如何让子视图委托这个改变的调用。所以我们会有一个BlueView。

public class BlueViewModel : BaseViewModel 
{ 
    //Relay command to call 'ToRed' function 
    public ICommand ChangeToRed 
    { 
     get { return new RelayCommand(ToRed); } 
    } 

    //Requires MainViewModel for BaseViewModel 
    public BlueViewModel(MainViewModel main) : base(main) 
    { 

    } 

    //Calling BaseViewModel function. Passed BaseViewModel Type 
    public void ToRed(object param) 
    { 
     Navigate<RedViewModel>(); 
    } 
} 

并有RedView:

public class RedViewModel : BaseViewModel 
{ 
    //Relay command to call 'ToBlue' function 
    public ICommand ChangeToBlue 
    { 
     get { return new RelayCommand(ToBlue); } 
    } 

    //Requires MainViewModel for BaseViewModel 
    public RedViewModel(MainViewModel main) : base(main) 
    { 

    } 

    //Calling BaseViewModel function. Passed BaseViewModel Type 
    public void ToBlue(object param) 
    { 
     Navigate<BlueViewModel>(); 
    } 
} 

我们MainWindow.xaml看起来是这样的:

<Window.DataContext> 
    <viewmodels:MainViewModel/> 
</Window.DataContext> 

<Grid> 
    <ContentControl Content="{Binding ViewModel}" /> 
</Grid> 

做这一切的孩子就能打电话给他们的父母,他们希望变化。 BaseViewModel为所有派生的孩子保存这个父项,所以他们可以在导航期间像接力棒一样来回传递它。

同样,导航都取决于您如何使用,构建和规划应用程序。它并不总是一个适合所有方式。

+0

多德非常感谢你!我会检查这一点。即使它不符合我的项目类型,它仍然可以给我更多关于如何处理这个问题的信息:)。再次感谢! – tutu

+0

没问题:)希望它能让你朝好的方向发展。 – Toskr

相关问题