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