Привязка ListBox к набору экранов (виджетов)

Учитывая, что у меня есть следующий виджет (и прикрепленное к нему представление):

public class MyWidgetViewModel : Screen {}

Я могу легко использовать и отображать его в другом представлении. Модель представления, в которой размещается виджет, выглядит следующим образом:

public class WidgetWorkspaceViewModel : Screen
{
    private Screen myWidget = new MyWidgetViewModel();

    public Screen MyWidget
    {
        get { return myWidget; }
        set { myWidget = value; }
    }
}

И элемент управления отображается в WidgetWorkspaceView следующим образом:

<ContentControl x:Name="OneWidget"/>

Все это прекрасно работает. Но теперь я хотел бы изменить его так, чтобы WidgetWorkspaceViewModel содержал коллекцию виджетов, а WidgetWorkspaceView должен отображать их один за другим. И у меня есть некоторые проблемы с тем, чтобы заставить это работать.

Модель представления должна выглядеть так:

private List<Screen> widgets;

public List<Screen> Widgets
{
    get { return widgets; }
    set { widgets = value; NotifyOfPropertyChange(() => Widgets); }
}

Эта часть кода в порядке, потому что я связал виджеты с полем со списком, и поле со списком правильно отображает список элементов управления. Но у меня проблемы с размещением виджетов в представлении. Это XAML, который я пытался использовать в WidgetWorkspaceView, но безуспешно:

<ListBox x:Name="Widgets">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <toolkit:WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Width="100" Height="100" DataContext="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Основываясь на контрольных точках, часть привязки данных работает нормально, но я не рисую виджеты.

Есть идеи, как это решить? Я использую Caliburn.Micro, чтобы помочь с привязками.


person Mikael Koskinen    schedule 08.03.2011    source источник


Ответы (1)


Я думаю, проблема в том, что Caliburn.Micro автоматически определит ItemTemplate для ItemsControl, который вы будете переопределять, поэтому вам нужно либо удалить его из своего ListBox, либо, если вы хотите его определить, используйте View присоединенное свойство для установки модели.

<ListBox.ItemTemplate>
  <DataTemplate>
    <ContentControl Width="100" Height="100" cal:View.Model="{Binding}" />
  </DataTemplate>
</ListBox.ItemTemplate>

Обратите внимание, что вы также можете использовать Conductor, например Conductor<IScreen>.Collection.OneActive или Conductor<IScreen>.Collection.AllActive, в качестве типа WidgetWorkspaceViewModel, а не поддерживать свой собственный список Screen. Эти проводники имеют коллекцию Items и поддерживают жизненный цикл экрана.

person devdigital    schedule 08.03.2011
comment
Отлично, спасибо за помощь! Я решил проблему, удалив определение ItemTemplate, и вместо этого я рассмотрю возможность использования Проводника. - person Mikael Koskinen; 08.03.2011