使用ListBox(或其他ItemsControl)来托管Caliburn演示者
-
05-07-2019 - |
题
如果我有 MultiPresenter
并且我使用 ListBox
来显示它正在托管的 Presenters
,我该如何让Caliburn发现并绑定视图和查看项目的模型?
例如,如果我有一个看起来像这样的简单视图:
<UserControl x:Class="MyProject.Views.CarView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ListBox ItemsSource="{Binding Parts}" />
</Grid>
</UserControl>
绑定到 CarViewModel
:
public class CarViewModel : MultiPresenter
{
public BindableCollection<IPartViewModel> Parts { get; }
}
Parts
集合包含实现 IPresenter
并具有相应视图的各种对象,例如 WheelViewModel
和 WheelView
, EngineViewModel
和 EngineView
。
我希望Caliburn使用视图策略为我解析视图。这可能吗?在这种情况下,我需要做些什么才能正确设置演示者的层次结构?
解决方案
您不必为此更改演示者层次结构。我建议您考虑使用 MultiPresenter.Presenters
属性来收集子ViewModels和 MultiPresenter.Open
和 MultiPresenter.Shutdown
方法(如果需要)强制执行子ViewModels生命周期。
对于绑定问题,您应该为ListBox项定义模板:
<ListBox ItemsSource="{Binding Parts}">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
使用 cal:View.Model
附加属性,框架负责为每个ViewModel创建适当的View,将其绑定到ViewModel并将其注入ContentControl。
您还应确保View和ViewModel的命名空间和类命名遵循Caliburn 默认约定如果您希望框架正确推断您的视图。否则,你必须编写一个自定义的IViewStrategy(虽然这并不难)。
编辑:在cal中修复绑定表达式:View.Model属性
不隶属于 StackOverflow