C# 如何使用树视图连接Silverlight和MVVM中的视图?

C# 如何使用树视图连接Silverlight和MVVM中的视图?,c#,.net,silverlight,mvvm,C#,.net,Silverlight,Mvvm,我正在构建一个Silverlight应用程序,该应用程序在左侧列中包含一个菜单选项树视图,在右侧列中包含一个ContentView。其思想是TreeView的SelectedItemChanged事件将更改内容区域中的视图 实现这一点的“最纯粹的MVVM”方式是什么 我的想法是使用treeemenuview和treeemenuviewmodel来管理菜单事件,但在这之后,我有点不知所措。我可以使用EventAggregator将一条消息从TreeMenuViewModel发送到一个“Conten

我正在构建一个Silverlight应用程序,该应用程序在左侧列中包含一个菜单选项树视图,在右侧列中包含一个ContentView。其思想是TreeView的
SelectedItemChanged
事件将更改内容区域中的视图

实现这一点的“最纯粹的MVVM”方式是什么

我的想法是使用
treeemenuview
treeemenuviewmodel
来管理菜单事件,但在这之后,我有点不知所措。我可以使用EventAggregator将一条消息从
TreeMenuViewModel
发送到一个“ContentViewModel”,然后该“ContentViewModel”将根据消息参数设置其当前的ContentView,但这肯定会破坏MVVM,因为ViewModel不应该知道像视图这样的UI构造

我是不是错过了一些简单的东西

ViewModel层是如何驱动视图选择的?

好的,我来试一试

在树视图模型中:

public string PropSelectedItem
{
get;
set;
}
public ViewModelBase PropSelectedItem
{
get
 {
switch(TreeMenuViewModelStatic.PropSelectedItem)
{
  case "Booo": return typeof(View1);
  case "Foo": return typeof(View2);
}


  }
private set;
}
树视图中

在ContentViewModel中:

public string PropSelectedItem
{
get;
set;
}
public ViewModelBase PropSelectedItem
{
get
 {
switch(TreeMenuViewModelStatic.PropSelectedItem)
{
  case "Booo": return typeof(View1);
  case "Foo": return typeof(View2);
}


  }
private set;
}
在ContentView中:


这里需要一个值转换器

我会创建一个
ShellViewModel
,它有:

  • ObservableCollection可用页面
  • int-SelectedPageIndex
  • ViewModelBase CurrentPage
    ,返回
    可用页面[SelectedPageIndex]
您的
ShellView
可以是您想要的任何内容。如果要在
树视图中显示
可用页面
,请继续。只需记住将
SelectedIndex
绑定到
`SelectedPageIndex

在您的情况下,我将创建一个
DockPanel
,左侧绑定到
AvailablePages
,右侧绑定到
ContentControl.Content
TreeView
,右侧绑定到
CurrentPage

编辑

这里有一个例子

<DockPanel>
    <TreeView DockPanel.Dock="Right"
              ItemsSource="{Binding AvailablePages}"
              SelectedItem="{Binding SelectedPageIndex}">
    ...
    </TreeView>

    <ContentControl Content="{Binding CurrentPage}" />
</DockPanel>

要将字符串转换为视图?我想我明白你的意思了,如果我理解的话,你的TreeView在TreeView模型中设置了所选的项(比如说,一些字符串值“MenuItem1”),然后你的ContentViewModel将该项公开给ContentView,转换字符串值后加载相应的视图控件-是这样吗?Rachel,谢谢,这是有道理的。我可以澄清一下,视图选择/绑定实际上发生在哪里?在您的描述中,如果我理解正确,
ContentControl.Content
已绑定到ViewModelBase实例(CurrentPage)-是否应将其绑定到视图?我肯定有些简单的东西我不明白:)@Malcom我在答案中添加了一些示例代码。ViewModel包含实际的应用程序状态和导航,而视图只是一个漂亮的UI,它允许用户与ViewModel交互。我通常使用DataTemplates将我的视图与其ViewModel关联我使用的是Silverlight,DataTemplates似乎不支持DataType属性-还有其他想法吗?@Malcum我忘记了Silverlight。。。我通常使用
DataTrigger
和自定义
Converter
,或
DataTemplateSelector
来确定要显示的数据模板我最终使用了Prism的
DataTemplateSelector
和您的上述技术,但我必须使用支持
DataType
属性的Silverlight 5。