如果我有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使用视图策略为我解析视图。这可能吗?在这种情况下,我需要做些什么才能正确设置演示者的层次结构?
答案 0 :(得分:8)
您不必为此更改演示者层次结构。我建议您考虑使用MultiPresenter.Presenters
属性来收集子ViewModel以及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 default convention。否则,你必须编写一个自定义的IViewStrategy(虽然这并不难)。
编辑:在cal中修复绑定表达式:View.Model属性