我有一个情况,我不确定我是否正确地做。
我有一个ApplicationViewModel
,这是我的整个应用程序的"外壳"。
在该视图模型中,我还有其他儿童视图。
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
在我的GameViewModel
中,我显示了一个包含标题,描述等的模型GamesModel
的对象列表。
当我单击此列表中的项目时,它将被选中,然后我想使用按钮将视图更改为EditGameViewModel
,但我不确定该如何做。
如何让我的孩子视频模型更改父录像模型中的内容?还是孩子应该这样做?
编辑
我希望它能运行
当我选择一个项目时,我想要并单击我从列表中选择的数据从视图GameViewModel
更改为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;
}
我可以提供有效的东西,但可能值得怀疑。这实际上都取决于您计划如何运行申请。
首先,类似于您的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为所有派生的孩子提供了这个父母,因此他们可以像警棍一样来回传递。
再次,导航实际上都取决于您的使用,构建和计划应用程序。