【发布时间】:2015-07-25 19:06:03
【问题描述】:
(我正在使用GalaSoft.MvvmLight 框架)
我在MainWindow.xaml 中有一些视图,我在运行时通过用户选择在它们之间动态切换。
这些视图使用以下技术与它们对应的视图模型绑定:
MainWindow.xaml
...
<Window.Resources>
<DataTemplate DataType="{x:Type vm:Control1ViewModel}">
<v:Control1/>
</DataTemplate>
... // Assume there is more then one DataTemplate. Every view has a unique view-model.
</Window.Resources>
...
Control1ViewModel.cs
public class Control1ViewModel : ViewModelBase
{
...
}
MainWindow.xaml 使用以下技术在上述视图之间切换:
MainWindow.xaml
...
<ContentControl Content="{Binding CurrentView}"/> // 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)以缩短问题代码部分。如上所述,假设有多个视图可以切换。
每次将CurrentView属性设置为新的ViewModelBase值(例如Control1ViewModel),WPF将构造绑定视图DataTemplate视觉树对象的新实例,所以旧的会丢失。
这意味着在视图之间切换时我无法缓存视图(例如Control1)。
我找到答案的唯一解决方案是使用其 ViewModel(使用 DataContext)“硬编码”视图,但遵循此解决方案会发生以下情况:
- 我正在打破 ViewModel-First 方法。
- 为了不破坏完整的 MVVM,我必须更改
CurrentView签名并将其移动到我的MainWindow.xaml后面的代码中。 - 我不是切换
ViewModelBase类型,而是切换具体控件。
我想知道是否有任何解决方案不使用视图模型“硬编码”视图,因此我可以保留当前的ViewModelBase 开关和 ViewModel-First 方法。
【问题讨论】: