【发布时间】:2015-02-21 21:07:11
【问题描述】:
我使用 MVVMLight,它带有一个 ViewModelLocator。
我最初的项目提出了以下问题。我有一个在启动应用程序时呈现的 MainView。根据单击的按钮,它通过我的 MainView 中的 ContentControl 呈现 View1 或 View2(每个都是用户控件)。
我在 MainViewModel 中找到了正确的视图模型。但我发现我还需要一个 DataTemplate 以便 View1 和 View2 中的用户控件将在 MainView 中正确呈现,否则它只会显示基于文本的类名称。
我对以下内容感到困惑:
a) 我需要视图模型定位器和 DataTemplate 来完成上述任务吗?我刚刚进入 WPF,但我认为我读到其中一个是必需的,而不是两者都需要。或者更具体一点:为什么我的视图中有DataContext="{Binding LiveDataViewModel, Source={StaticResource Locator}}">(它将绑定到它自己的视图模型)但仍然需要一个DataTemplate?
b) 这是视图模型优先方法还是视图优先方法?
c) 我尝试了一个代码背后的解决方案,实际上我花了 4 行代码来完成完全相同的事情,这让我花了很多类、绕道、eventToCommand 和转换器 [因为触发视图选择的控件只会引发事件不是命令],数据模板,视图模型定位器,不同的视图模型......这看起来像是付出了巨大的代价却没有任何优势。把它放到后面的代码中在我看来非常好,因为它是纯 UI 内容(选择视图并绑定到内容控件,完成)。我在这里错过了什么吗?我会通过背后的代码放弃什么?
我是 WPF 和 MVVM 的新手,现在我非常沮丧,因为感觉就像我在一个看似微不足道的问题上绕圈子。
【问题讨论】:
-
a MainView that is rendered upon stating up the app. Depending on buttons clicked it renders either View1 or View2 (each are user controls) via ContentControl inside my MainView.- 这听起来像TabControl对我来说。不要试图重新发明轮子,它已经被发明了;) -
@HighCore,它是 DevExpress 中的 RibbonControl,我需要根据功能区页面选择更改视图(注意:不是功能区组中的按钮)。所以请放心,这里没有什么是重新发明的,;-) [我使用了术语按钮,因为我的问题不是我如何实现 EventToCommanding]。
-
不完全是您问题的答案,但是您是否查看过 Frame 控件?在您的功能区控件引发的事件中,您可以向 MainView 发送一条消息以更改框架的 Source 属性。
-
顺便说一句,
SelectedPageName问题已在 13.1.20 和 13.2.8 apparently 中修复。您应该报告它仍在当前版本中发生(如果确实如此)
标签: c# wpf mvvm mvvm-light