Csharp/C#教程:如何使用DataTemplates通过ViewModel-First方法缓存动态切换的视图分享


如何使用DataTemplates通过ViewModel-First方法缓存动态切换的视图

(我使用的是GalaSoft.MvvmLight框架)

我在MainWindow.xaml中有一些视图,我通过用户选择在运行时动态切换它们。

这些视图使用以下技术与其对应的视图模型绑定:

MainWindow.xaml

 ...     ... // Assume there is more then one DataTemplate. Every view has a unique view-model.  ... 

Control1ViewModel.cs

 public class Control1ViewModel : ViewModelBase { ... } 

MainWindow.xaml使用以下技术在上面的视图之间切换:

MainWindow.xaml

 ...  // This is were the view appears. ... 

MainViewModel.cs

 public class MainViewModel : ViewModelBase { ... private ViewModelBase _currentView; public ViewModelBase CurrentView { get { return _currentView; } private set { _currentView = value; base.RaisePropertyChanged("CurrentView"); } } ... } 

为方便起见,我没有添加更多控件,只需添加一个( Control1 )来缩短问题代码部分。 如上所述,假设有多个视图要切换。

每次使用新的ViewModelBase值设置CurrentView属性(例如Control1ViewModel )时, WPF将构造绑定视图DataTemplate可视树对象的新实例 ,因此旧的实例将丢失。

这意味着我无法在它们之间切换时缓存视图(例如Control1 )。

我在回答中找到的唯一解决方案是使用ViewModel(使用DataContext)对视图进行“硬编码”,但遵循此解决方案会发生以下情况:

我想知道是否有任何解决方案没有使用视图模型“硬编码”视图,因此我可以保留当前的ViewModelBase开关和ViewModel-First方法。

您可以采用以下方法:

  1. 而不是采取ContentControl采取ItemsControl

  1. ItemsControl作为网格,将SelectedItem设置为Z-Index为1,将其余项目设置为Z-Index为0.这样,一次只能看到一个视图,这将超过其他视图。

  2. MainViewModel获取两个属性。 ObservableCollection类型的ViewModelBase ObservableCollectionObservableCollection类型的CurrentView ,并分别将它与ItemsControlsItemsSourceSelectedItem绑定。

现在,当您想要打开视图时,创建一个ViewModel,将其添加到Views列表并将其设置为CurrentView。 如果它已经在列表中,只需将其设置为CurrentView。

如果您希望永久关闭按钮,也可以提供关闭按钮。 即如果你将它关闭,它将从列表中删除,不会被缓存。

这可以像在窗口中打开不同的视图一样工作,并且可以在它们之间切换。 如果你想要,你可以关闭一个视图。

编辑:见下面的代码:

                  

在这里,您可以看到在ViewModel您必须拥有一个属性ZIndex ,它将用于显示顶部的当前视图。 因此,只要您想显示视图,只需将ViewModel ZIndex属性设置为1并将重置视图重置为0即可。

上述就是C#学习教程:如何使用DataTemplates通过ViewModel-First方法缓存动态切换的视图分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/cdevelopment/949987.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐