使用ListBox(或其他ItemsControl)来托管Caliburn演示者

时间:2009-11-27 09:21:28

标签: wpf mvvm itemscontrol caliburn

如果我有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并具有相应视图的各种对象,例如WheelViewModelWheelView,以及EngineViewModelEngineView

我希望Caliburn使用视图策略为我解析视图。这可能吗?在这种情况下,我需要做些什么才能正确设置演示者的层次结构?

1 个答案:

答案 0 :(得分:8)

您不必为此更改演示者层次结构。我建议您考虑使用MultiPresenter.Presenters属性来收集子ViewModel以及MultiPresenter.OpenMultiPresenter.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属性