Привязка ViewModel или Model с помощью Caliburn.Micro - PullRequest
1 голос
/ 16 марта 2011

Это больше вопрос MVVM, чем вопрос калибровки, но он связан с тем, как я могу сделать это с помощью калибра.

Я новичок в разработке Sliverlight / WP7, поэтому, пожалуйста, дайте мне знать, если я не достаточно хорошо описываю себя.

Я правильно подключил caliburn.micro к приложению WP7 с phonecontainer / simplecontainer, viewmodels и т. Д. Проблема, с которой я сталкиваюсь, заключается в том, как правильно привязать коллекцию моделей к экрану.

Например, у меня есть следующая модель:

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 для привязки коллекции объектов модели к виду, который вы будете использовать в навигации. Как вы можете видеть, когда кто-то нажимает одну из кнопок, я сделаю еще один вызов api rest на следующую модель представления, чтобы получить данные об этих элементах и ​​снять их на экране. Однако я не могу отобразить элементы на экране, используя этот код списка. Я попытался использовать ItemsSource = SummaryItems, и это сработало, но, похоже, не совсем так, как сэмплы. В примерах я заметил, что свойство Items используется в модели представления, и я не уверен, как оно интегрируется с объектами модели.

Вероятно, у меня просто нет четкого представления о том, как работает связывание во всех этих ситуациях и как с этим взаимодействует калибровка. Может ли кто-нибудь указать мне правильное направление?

Любая помощь будет принята с благодарностью. Спасибо!

Sean

1 Ответ

1 голос
/ 17 марта 2011

Вам нужно добавить элементы в вашу 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);
        }
    }
}
...