Caliburn Micro,动态加载视图/视图模型

时间:2013-12-02 12:35:34

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

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

我正在处理的应用程序包含MainAppView,MainAppMenuView和MainAppContentView。使用相应的ViewModels。 这一切都很好。

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

所以我为此创建了几个Views和ViewModel。现在有一组用户可以选择的不同图块。

我们的想法是有一个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

1 个答案:

答案 0 :(得分:0)

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

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

cal:View.Model="{Binding}"应使用内置约定为每个切片处理Caliburn.Micro / ViewModel分辨率。您必须使托管控件Conductor<IScreen>.Collection.AllActive允许所有View一次处于活动状态。

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

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