c# - Caliburn Micro,动态加载的 View / View 模型

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

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

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

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

所以我为此创建了几个 View 和 View 模型。现在有一组不同的瓷砖可供用户选择。

当时的想法是有一个 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>

想法,链接到 sample 或任何东西......将不胜感激。

Link to my test code

最佳答案

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

在托管您的磁贴的主控件上,您可以维护 Tile 的集合对象,每次你想添加一个新的Tile并显示它,您可以添加新的 ViewModel Tiles 集合的实例并调用Caliburn.Micro Activate新实例上的方法。在我的脑海中,我认为您需要更改您的 DataTemplate所以cal:View.Model属性直接绑定(bind)到对象,而不是属性,所以类似于 cal:View.Model="{Binding}"Caliburn.Micro应该照顾ViewModel/View每个图 block 的分辨率,使用内置的约定。您必须进行主机控制 Conductor<IScreen>.Collection.AllActive 允许所有 Tiles立即活跃起来。

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

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

关于c# - Caliburn Micro,动态加载的 View / View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20328517/

相关文章:

c# - 如何以编程方式将 C# 中的图像源设置为 XAML 静态资源?

c# - 从 NSDictionary 中获取浮点值

javascript - 使用 CefSharp 将字符串/JSON 从 C# 传递到 JS

c# - 是否可以使用事件聚合器在 WPF MVVM 应用程序中的模型类之间进行通信?

silverlight - Silverlight MVVM : How to do Localization in the correct way?

wpf - MVVM - 重用具有多个 ViewModel 的 View

c# - DataGrid -- AlternatingRowBackground 颜色干扰 "IsMouseOver"颜色

c# - 强制网页上的用户控件初始化自身

c# - Entity-framework-7 将 Fluent API 配置组织到一个单独的类中

swift - 无法使用 ViewModel 加载数据