我一直在玩 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/