如何在 CM 管理的窗口中重用和组合部件?我发现了有关使用两个 UserControls 绑定(bind)到同一个 ViewModel 的帖子,但如果我想在同一个窗口中组合多个 View 和 View 模型,则没有那么多。 (组成“主视图”的每个 View 的 View 模型)
我的问题的第一部分是如何分解码件以供重复使用?如果我有一个窗口的两个区域,其中一个是数据网格,另一个是带有标签和文本框的详细信息 View ,这些区域是否应该位于单独的用户控件、自定义控件或窗口中?理想情况下,每个窗口都是独立的,这样它们就可以分开并在其他窗口中使用。
因此,如果将它们分开,我最终会得到 2 个 View 模型和 2 个 View 。现在假设我想创建 3 个窗口,一个窗口包含第一个 View ,第二个窗口包含第二个 View ,第三个窗口包含两个 View 。如何使用 CM 为每个 View 创建窗口并将每个 View 连接到其 View 模型?从我看到的示例中,我在窗口中看到的大部分是单个 View 和 View 模型。
最佳答案
我不会以任何方式声称自己是 CM 方面的专家,但我已经通过我一直在编写的简单“基准浏览器”取得了相当的成功。它使用一个“shell View ”来组成另外两个 View ,每个 View 都有自己的 ViewModel。 shell View 如下所示:
<Window x:Class="NodaTime.Benchmarks.Explorer.Views.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="NodaTime Benchmarks" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>...</Grid.ColumnDefinitions>
<ContentControl x:Name="BenchmarkPicker" Grid.Column="0"/>
<GridSplitter ... />
<ContentControl x:Name="ResultsGraph" Grid.Column="2"/>
</Grid>
</Window>
然后 ResultsGraphView
和 BenchmarkPickerView
分别是这样的:
<UserControl x:Class="NodaTime.Benchmarks.Explorer.Views.ResultsGraphView"
... namespaces etc ...>
<Grid>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<Grid.ColumnDefinitions>...</Grid.ColumnDefinitions>
... controls ...
</Grid>
</UserControl>
ShellViewModel
将其他两个 ViewModel 作为属性公开。然后这些会在构造时自动传递到 View 。 ( Bootstrap 不提供任何获取它们的方法。)
现在这完全不符合您的描述,因为我认为您不能单独使用两个单独的 View 作为窗口 - 我怀疑您最终会得到总共 5 个 View :
SubViewOne - a UserControl with the first view parts
SubViewTwo - a UserControl with the second view parts
JustViewOne - a Window containing just SubViewOne
JustViewTwo - a Window containing just SubViewTwo
BothViews - a Window containing both SubViewOne and SubViewTwo
我不认为有一种方法可以解决您不希望一个窗口
位于另一个窗口这一事实,并且顶层窗口必须是......嗯,一个Window
。
希望这会有所帮助,如果您想了解我正在做的小项目的更多详细信息,请告诉我 - 它与生产质量相去甚远,特别是在 DI 方面,但它可能足以帮助您开始。
关于c# - Caliburn Micro -> 从多个 View /用户控件/自定义控件组合 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512461/