鉴于我有以下小部件(以及附加的视图):
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包含一个Widgets集合,WidgetWorkspaceView应该一个接一个地显示它们。我在解决这个问题上遇到了一些问题。
视图模型应该如下所示:
private List<Screen> widgets;
public List<Screen> Widgets
{
get { return widgets; }
set { widgets = value; NotifyOfPropertyChange(() => Widgets); }
}
这部分代码没问题,因为我已将Widgets绑定到组合框,组合框正确显示控件列表。但是我在视图上“托管”小部件时遇到了问题。这是我尝试在WidgetWorkspaceView中使用的XAML但没有成功:
<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来帮助解决这些问题。
答案 0 :(得分:1)
我认为问题是Caliburn.Micro会自动为ItemsControl定义ItemTemplate,你将覆盖它,所以你需要从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
集合,并支持屏幕生命周期。