ViewModel或模型与Caliburn.Micro绑定

时间:2011-03-16 19:26:19

标签: windows-phone-7 mobile caliburn.micro

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

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

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

例如,我有以下型号:

SummaryItem
{
    int Id
    string Name
    string Description
}

相应的viewmodel:

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将一组模型对象绑定到您将在导航中使用的视图的正确方法是什么。正如您所看到的,当有人单击其中一个按钮时,我将在下一个视图模型上进行另一个api调用,以获取该项目数据并在屏幕上将其拍摄。但是,我无法使用该列表框代码将项目显示在屏幕上。我尝试使用ItemsSource = SummaryItems,但这样做似乎没有找到样本如何seutp。我在样本中注意到,在viewmodel上使用了Items属性,我不确定它是如何与模型对象集成的。

我可能只是没有清楚地了解在所有这些情况下绑定是如何工作的以及校准如何与其集成。有人能指出我正确的方向吗?

非常感谢任何帮助。谢谢!

肖恩

1 个答案:

答案 0 :(得分: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);
        }
    }
}