c# - 如何使用 TreeView 连接 Silverlight 和 MVVM 中的 View ?

标签 c# .net silverlight mvvm

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

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

我的想法是有一个 TreeMenuViewTreeMenuViewModel用于管理菜单事件,但在那之后我有点迷路了。我可以使用 EventAggregator 从 TreeMenuViewModel 发送消息到“ContentViewModel”,然后根据消息 args 设置其当前的 ContentView——但肯定会破坏 MVVM,因为 ViewModel 不应该知道像 View 这样的 UI 构造?

我在这里错过了一些简单的东西吗?

ViewModel 层如何驱动 View 选择?

最佳答案

我会创建一个 ShellViewModel其中有:

  • ObservableCollection<ViewModelBase> AvailablePages
  • int SelectedPageIndex
  • ViewModelBase CurrentPage ,返回 AvailablePages[SelectedPageIndex]

  • 您的 ShellView可以是任何你想要的。如果您想显示您的 AvailablePagesTreeView ,然后继续。记得绑定(bind)SelectedIndex`SelectedPageIndex
    在你的情况下,我会创建一个 DockPanelTreeView在左侧绑定(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/

    相关文章:

    c# - ASP.Net C# 主站

    asp.net - 如何发布使用 Enterprise Library 进行日志记录的 Web 应用程序?

    .net - 与 Azure 表存储的连接失败

    c# - MEF 进口最小起订量?

    silverlight - Silverlight 导航应用程序中的导航历史记录

    javascript - Async/Await 在 ASP.NET Core Controller 操作中没有按预期工作

    c# - 如何从 UWP 应用程序的列表中删除项目?

    c# - 从供应商的 Global.asax 继承 Global.asax 时,Application_Start 不会触发

    .net - 从方法中将 BlockingCollection 作为 IEnumerable 返回

    silverlight - 有没有办法以编程方式取消编辑文本框?