我对WPF和MVVM比较陌生,我发现最困难的事情就是如何在应用程序中简单地切换用户控件或视图。
在winforms中,要让控件自行删除,你可以简单地说这个.Parent.Controls.Remove(this);
在WPF中没有通用的Parent控件,您必须将其类型转换为特定类型(即Grid),然后将其删除。
这似乎打破了MVVM架构。我还尝试了数据模板和内容演示器,除了我无法从代码更改datacontext这一事实外,它的工作正常,因为datacontext始终是viewmodellocator。
现在,页面是否可以在WPF中执行此操作?如果我有一个带有自定义usecontrol的网格,并且我想根据viewModel中的某个变量切换它,该怎么办?似乎在WPF中无法轻松完成最简单的任务。
答案 0 :(得分:34)
您可以在父ViewModel中执行此操作。
例如,如果您的网页(称之为PageViewModel
)有两个观看次数(ViewModelA
和ViewModelB
),那么PageViewModel
上会有一个名为{{1}的属性这将决定哪个View可见。当CurrentView
设置为PageViewModel.CurrentView
的实例时,ViewA的DataTemplate将用于绘制内容。当它设置为ViewModelA
的实例时,将显示ViewB的DataTemplate。
ViewModelB
从父视图调用switch views命令是理想的(在本例中是<DataTemplate DataType="{x:Type local:PageViewModel}">
<ContentControl Content="{Binding CurrentView}" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelA}">
<TextBlock Text="I'm ViewModelA" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelB}">
<TextBlock Text="I'm ViewModelB" />
</DataTemplate>
的DataTemplate),但是如果你想从ViewModelA / B中切换视图,你可以连接创建对象时手动创建事件(PageViewModel
)或查看消息传递系统。 MVVM Light有一个简单的CurrentView.ChangeViewCommand = this.ChangeViewCommand
类,我发现它很容易使用,或者Prism有一个更高级的Messenger
如果要为同一个ViewModel切换视图,我建议使用一个Mode属性来确定要使用的视图。例如:
EventAggregator
修改强>
我实际上看到这样的问题出现了很多,所以如果有人有兴趣就发布一些关于它的事情here