代码之家  ›  专栏  ›  技术社区  ›  GraemeF

使用列表框(或其他ItemsControl)来承载Caliburn演示者

  •  4
  • GraemeF  · 技术社区  · 15 年前

    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使用视图策略为我解决视图。这可能吗?在这种情况下,我需要如何正确设置演示者的层次结构?

    1 回复  |  直到 13 年前
        1
  •  9
  •   superjos    10 年前

    您不必为此更改演示者层次结构。我只是建议你考虑使用 MultiPresenter.Presenters MultiPresenter.Open MultiPresenter.Shutdown 方法,如果需要强制子ViewModels生命周期。

    对于绑定问题,您应该为列表框项目定义模板:

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

    使用 cal:View.Model

    default convention 如果希望框架能够正确推断视图,请执行以下操作。否则,您必须编写一个定制的IViewStrategy(尽管并不难)。


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