首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将控件添加到逻辑树父级

将控件添加到逻辑树父级
EN

Stack Overflow用户
提问于 2020-07-07 04:46:57
回答 3查看 29关注 0票数 1

我的主窗口是一个相对简单的DockPanel

代码语言:javascript
复制
<DockPanel>
    <!--Bottom row--> 
    <Border DockPanel.Dock="Bottom">
        <DockPanel DockPanel.Dock="Bottom">
            <!--Detector Indicator-->
            <views:DetectorIndicatorView DataContext="{Binding DetectorViewModel}" DockPanel.Dock="Left"/>
            <!--Logo-->
            <Image DockPanel.Dock="Right" HorizontalAlignment="Right"                     Source="/Resources/Images/Logo.png"/>
        </DockPanel>
    </Border>
        
    <!--Main display-->
    <views:TabControlView DataContext="{Binding TabsViewModel}"/>
</DockPanel>

TabControlSelectedContent中,每个选项卡都有一个视图模型,每个选项卡都可以托管各种视图模型。

在某一点上,这棵树基本上看起来像:

代码语言:javascript
复制
<MainWindow>
    <TabControl>
        <ExamTab>
            <EditExam/>
        </ExamTab>
    </TabControl>
</MainWindow>

EditExam页面上,我希望在MainWindowBottom row中出现一个工具栏。工具栏按钮将绑定到EditExamViewModel上的命令。

有没有办法将类似这样的内部控件“注入”到“外部模板”(即主窗口)中?

我能想到的唯一方法是从MainWindow中取出最下面的一行,并将其粘贴到每个单独的视图中,除了EditExamView中的一个实例之外,它们都是相同的。这是唯一的办法吗?

EN

回答 3

Stack Overflow用户

发布于 2020-07-07 22:26:31

有没有办法将类似这样的内部控件“注入”到“外部模板”(即主窗口)中?

不,没有,至少在XAML中没有。

例如,通过使用Window.GetWindow方法获取视图中父窗口的引用,或者使用event aggregatormessenger从“选项卡”视图模型引发事件或发送消息到窗口视图模型或窗口,可以通过编程的方式实现。

票数 0
EN

Stack Overflow用户

发布于 2020-07-08 00:35:49

您所描述的内容在现代应用程序中很常见。甚至菜单也经常根据活动视图进行交换。但是,在XAML或WPF中没有内置的方法来实现这一点。解决这个问题的最简单方法是

...将底部行从MainWindow中取出并将其粘贴到每个单独的视图中,除了EditExamView中的一个实例外,与每个视图相同。..。

最困难的方法是自己开发此场景所需的所有内容,包括

models

  • Communication

  • 创建视图和视图模型作为数据上下文动态

  • 一个概念,用于定义视图应在哪些区域传入和传出相关视图,包括视图之间的同步或激活和停用检查选项卡的激活和停用的视图

  • 自定义命令,您可以将视图连接到选项卡view

  • ...

这是很多你自己可能写不出来的代码。但您并不孤单,因为有一些应用程序框架旨在弥合UI框架和您的代码(如Caliburn MicroPrism )之间的差距。这些框架使您可以跳过许多样板代码,并为各种问题提供服务和机制,但代价是学习它们和进行一些定制以满足您的需求。

以棱镜为例,针对上述问题提供了以下解决方案

用于定义application

  • A富区域导航服务中区域的依赖项注入container

  • Regions
  • 用于使用可跨views
  • ...

使用的active awareness

  • Composite命令的communication

  • Region适配器的事件聚合器

乍一看,这似乎不堪重负,但随着您对所选框架的熟悉程度越高,应用程序开发就越容易,因为您将重用概念和组件。在这一点上,我建议您不要重新发明轮子。首先,您可以使用简单的解决方案,开始熟悉任何框架并逐步迁移您的应用程序。

票数 0
EN

Stack Overflow用户

发布于 2020-07-08 08:01:10

所以实际上我已经想出了一个非常好的简单的解决方案,它很简单:

代码语言:javascript
复制
<ContentControl Content=“{Binding TabControlViewModel.Tabs[SelectedIndex].CurrentViewModel.ToolbarViewModel}”/>

如果当前视图模型没有工具栏视图模型,那么它将只计算为null,并且不显示任何内容。然后我可以为ToolbarViewModel定义一个数据模板,我们就都准备好了。

如果我想让不同的页面在底部栏中有不同的东西,我可以让ToolbarViewModel是某种更通用的类型(可能还有一个不同的名称),可能是我的视图模型库是什么,然后任何页面的VM都可以是我想要的任何类型的视图模型,并且我可以设置DataTemplate。唯一的警告是,我不认为我可以为任何给定的VM使用多个模板,但我可以通过为我想要呈现的每种方式创建简单的子类来绕过这一点,这样我就可以拥有不同的模板。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62764258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档