Привязка ListBox к коллекции экранов (виджетов) - PullRequest
1 голос
/ 08 марта 2011

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

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, чтобы помочь с привязками.

1 Ответ

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

Я думаю, что проблема в том, что 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 и поддерживают жизненный цикл экрана.

...