1

这更像是一个 MVVM 问题,而不是一个 caliburn 问题,但它与我如何使用 caliburn 完成它有关。

我是 Sliverlight/WP7 开发的新手,所以如果我描述自己不够好,请告诉我。

我已经将 caliburn.micro 正确连接到带有 phonecontainer/simplecontainer 和 viewmodels 等的 WP7 应用程序。我遇到的问题是如何正确地将模型集合绑定到屏幕上。

例如我有以下模型:

SummaryItem
{
    int Id
    string Name
    string Description
}

以及相应的视图模型:

SummaryViewModel : Conductor<IScreen>.Collection.OneActive
{
    ObservableCollection<SummaryItem> SummaryItems;

    OnInitialize()
    {
        SummaryItems = // REST api call to load items
    }
}

和观点:

         <ListBox x:Name="SummaryItems" Height="617" HorizontalAlignment="Left" VerticalAlignment="Top" Width="468" Background="Transparent">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Button Width="460" Height="120">
                        <Button.Content>
                            <StackPanel Orientation="Horizontal" Height="120" Width="400">
                                <TextBlock Text="{Binding Id}" Height="120" FontSize="40" Width="350" />
                                <TextBlock Text="{Binding Name}" Height="120" FontSize="40" Width="350" />
                                <TextBlock Text="{Binding Description}" FontSize="40" Width="50" TextAlignment="Right" />
                            </StackPanel>
                        </Button.Content>
                    </Button>
                    <ContentControl cal:View.Model="{Binding}" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我的问题是,silverlight/caliburn 中将模型对象集合绑定到您将在导航中使用的视图的正确方法是什么。如您所见,当有人单击其中一个按钮时,我将在下一个视图模型上进行另一个 rest api 调用以获取该项目数据并将其拍摄到屏幕上。但是,我无法使用该列表框代码让项目出现在屏幕上。我尝试使用 ItemsSource=SummaryItems,这很有效,但它似乎并没有确定样本的 seutp 方式。我在示例中注意到,在视图模型上使用了 Items 属性,我不确定它是如何与模型对象集成的。

我可能只是不清楚绑定在所有这些情况下的工作原理以及 caliburn 如何与之集成。谁能指出我正确的方向?

任何帮助将不胜感激。谢谢!

肖恩

4

1 回答 1

1

您需要将项目添加到您的 ObservableCollection 中,而不是从调用中创建一个新的 ObservableCollection:

SummaryViewModel : Conductor<IScreen>.Collection.OneActive
{
    private readonly ObservableCollection<SummaryItem> _items;
    public ObservableCollection<SummaryItem> SummaryItems 
    {
        get 
        {
            return _items;
        }
    }
    ObservableCollection<SummaryItem> SummaryItems;

    public SummaryViewModel() 
    {
        _items = new ObservableCollection<SummaryItem>();
    }

    protected override void OnInitialize()
    {
        var items = MyRestCall();
        SummaryItems.Clear();
        foreach(SummaryItem s in items)
        {
            SummaryItems.Add(s);
        }
    }
}
于 2011-03-17T03:44:53.250 回答