Привязка 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, чтобы помочь с привязками.
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
сбор и поддержка жизненного цикла экрана.