我正在构建一个 Silverlight 应用程序,该应用程序包含左侧列中的菜单选项 TreeView 和右侧列中的 ContentView。这个想法是 SelectedItemChanged
TreeView 的事件将更改内容区域中的 View 。
实现这一目标的“最纯粹的 MVVM”方式是什么?
我的想法是有一个 TreeMenuView
和 TreeMenuViewModel
用于管理菜单事件,但在那之后我有点迷路了。我可以使用 EventAggregator 从 TreeMenuViewModel
发送消息到“ContentViewModel”,然后根据消息 args 设置其当前的 ContentView——但肯定会破坏 MVVM,因为 ViewModel 不应该知道像 View 这样的 UI 构造?
我在这里错过了一些简单的东西吗?
ViewModel 层如何驱动 View 选择?
最佳答案
我会创建一个 ShellViewModel
其中有:
ObservableCollection<ViewModelBase> AvailablePages
int SelectedPageIndex
ViewModelBase CurrentPage
,返回 AvailablePages[SelectedPageIndex]
您的
ShellView
可以是任何你想要的。如果您想显示您的 AvailablePages
在 TreeView
,然后继续。记得绑定(bind)SelectedIndex
至`SelectedPageIndex
在你的情况下,我会创建一个
DockPanel
与 TreeView
在左侧绑定(bind)到 AvailablePages
, 和 ContentControl
右边是 ContentControl.Content
绑定(bind)到CurrentPage
编辑
这是一个例子
<DockPanel>
<TreeView DockPanel.Dock="Right"
ItemsSource="{Binding AvailablePages}"
SelectedItem="{Binding SelectedPageIndex}">
...
</TreeView>
<ContentControl Content="{Binding CurrentPage}" />
</DockPanel>
然后使用
DataTemplates
定义 ContentControl 如何包含 CurrentPage
将要看<Window.Resources>
<DataTemplate DataType="{x:Type local:HomePageViewModel}" />
<local:HomePageView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:CustomerViewModel}" />
<local:CustomerView />
</DataTemplate>
</Window.Resources>
关于c# - 如何使用 TreeView 连接 Silverlight 和 MVVM 中的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256345/