【问题标题】:Caliburn Micro, dynamically loaded views/viewmodelsCaliburn Micro,动态加载的视图/视图模型
【发布时间】:2013-12-02 12:35:33
【问题描述】:

我一直在玩 Caliburn Micro 一段时间。

我正在处理的应用程序由 MainAppView、MainAppMenuView 和 MainAppContentView 组成。使用相应的 ViewModel。 这一切都很好。

现在,我想在 MainAppContentView 中动态显示几个看起来像 Windows 8 Startscreen Tiles 的 UserControl。 这意味着用户应该能够从 ListBox 中选择应用程序将显示的 UserControl。

所以我为此创建了几个视图和视图模型。现在有一系列不同的图块可供用户选择。

当时的想法是有一个 Tile 模型:

namespace CaliburnMicro.Test.Model
{
    public class Tile
    {
        public int ID { get; set; }
        public string View { get; set; }
        public List<string> Views { get; set; }
        public string TileSize { get; set; }

    }
}

然后从 Tile.View 或 Tile.Views 属性中解析要显示的 View/ViewModel。

有人知道如何使用 Caliburn Micro 完成这项工作吗?

我试图通过制作这样的 DataTemplate 来解决它:

<DataTemplate>
    <Grid Margin="4">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50*" />
            <ColumnDefinition Width="50*" />
            <ColumnDefinition Width="50*" />
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding ID}" FontWeight="Bold"  />
        <TextBox Grid.Column="1" Text="{Binding ID }" />
        <ContentControl Grid.Column="2"  cal:View.Model="{Binding View}" />
    </Grid>
</DataTemplate>

想法、示例链接或任何东西......将不胜感激。

Link to my test code

【问题讨论】:

  • 所有的 Tiles 是否会共享相同的行为(只是外观不同),还是需要为每个 Tiles 单独设置一个 ViewModel
  • 嗨,所有的瓦片都将有一个视图和一个视图模型。但是一个特定的瓦片将显示什么视图和视图模型,应该在瓦片对象中定义。我的想法是瓷砖对象只是将瓷砖的属性定义为大小、颜色、视图或视图、isSelected ......等等。虽然 tile 的内容将是一个带有 viewModel 的视图,但它的表示/数据绝不会链接到 tile/tile 对象。

标签: c# wpf mvvm ioc-container caliburn.micro


【解决方案1】:

我目前不在可以测试的地方,但我会通过在我的所有ViewModels 中继承一个基础TileViewModel(或Tile)来接近它(尽管您可能还会定义一个 ITile 接口)。这可能包含Tile 位置信息、显示大小和其他常见的Tile 行为。

在托管您的磁贴的主控件上,您可以维护Tile 对象的集合,并且每次您想要添加新的Tile 并显示它时,您可以将新的ViewModel 实例添加到Tiles 的集合并在新实例上调用 Caliburn.Micro Activate 方法。在我的脑海中,我认为您需要更改 DataTemplate 以便将 cal:View.Model 属性直接绑定到对象,而不是属性,所以类似于 cal:View.Model="{Binding}"

Caliburn.Micro 应该使用内置约定处理每个图块的ViewModel/View 分辨率。您必须使托管控件Conductor&lt;IScreen&gt;.Collection.AllActive 允许所有Tiles 一次处于活动状态。

在这种特殊情况下可能感兴趣的另一个属性是cal:View.Context 属性,它允许您在同一个ViewModel 上拥有多个Views。因此,您的每个Tiles 都可以支持不同的Views 以提供不同的信息(或功能)。在documentation 中简要提到了它,我在解释约定方面很擅长:One ViewModel, multiple views

当我有机会时,我会尝试测试我的上述建议,看看它是否可行。

【讨论】:

  • 谢谢评论。我也有类似的想法。但是我是 WPF 的新手,对于 WinForms 开发人员来说,同时有很多新东西 ;-) C# 部分、ViewModels 和 Objects 对我来说大部分是清楚的,但是将它与 View 挂钩并不是那么清楚.
  • 没问题,Caliburn.Micro 值得一试,你会发现很多ViewModel/`View' 的接线都是由默认约定处理的。如果有机会,我会尝试举一个例子。不过,总是值得留意其他方法,我的建议可能不是最好的 =D
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多