儿童ViewModel是否应该能够在父viewmodel上更改



我有一个情况,我不确定我是否正确地做。

我有一个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为所有派生的孩子提供了这个父母,因此他们可以像警棍一样来回传递。

再次,导航实际上都取决于您的使用,构建和计划应用程序。

并不总是适合一个尺寸。

最新更新