4

如果我有 aMultiPresenter并且我正在使用 aListBox来显示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并具有相应视图的各种对象,例如WheelViewModelandWheelViewEngineViewModeland EngineView

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

4

1 回答 1

9

您不必为此更改演示者层次结构。如果您需要强制执行子 ViewModel 的生命周期,我只建议您考虑使用该MultiPresenter.Presenters属性来收集子 ViewModel 和MultiPresenter.Openand方法。MultiPresenter.Shutdown

对于绑定问题,您应该为 ListBox 项定义模板:

<ListBox ItemsSource="{Binding Parts}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl cal:View.Model="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

使用cal:View.Model附加属性,框架负责为每个 ViewModel 创建适当的 View,将其绑定到 ViewModel 并将其注入 ContentControl。

如果希望框架正确推断视图,还应确保视图和视图模型的命名空间和类命名遵循 Caliburn默认约定。否则,您必须编写一个自定义的 IViewStrategy(不过这并不难)。


编辑:修复了 cal:View.Model 属性中的绑定表达式

于 2009-11-27T14:21:49.183 回答