如何使用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方法。
您可以采用以下方法:
- 而不是采取
ContentControl
采取ItemsControl
-
将
ItemsControl
作为网格,将SelectedItem
设置为Z-Index
为1,将其余项目设置为Z-Index
为0.这样,一次只能看到一个视图,这将超过其他视图。 -
在
MainViewModel
获取两个属性。ObservableCollection
类型的ViewModelBase
ObservableCollection
和ObservableCollection
类型的CurrentView
,并分别将它与ItemsControls
的ItemsSource
和SelectedItem
绑定。
现在,当您想要打开视图时,创建一个ViewModel,将其添加到Views列表并将其设置为CurrentView。 如果它已经在列表中,只需将其设置为CurrentView。
如果您希望永久关闭按钮,也可以提供关闭按钮。 即如果你将它关闭,它将从列表中删除,不会被缓存。
这可以像在窗口中打开不同的视图一样工作,并且可以在它们之间切换。 如果你想要,你可以关闭一个视图。
编辑:见下面的代码:
在这里,您可以看到在ViewModel
您必须拥有一个属性ZIndex
,它将用于显示顶部的当前视图。 因此,只要您想显示视图,只需将ViewModel
ZIndex
属性设置为1并将重置视图重置为0即可。
上述就是C#学习教程:如何使用DataTemplates通过ViewModel-First方法缓存动态切换的视图分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949987.html