如果我有 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属性

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top