我想在Canvas上呈现一堆用户控件,但每个usercontrol都应该呈现为自定义内容控件的内容。
自定义内容控件称为Window,提供边框,一些按钮等,允许用户在画布上拖动窗口。我已经定义了画布及其子画面:
<ItemsControl Grid.Column="2" Grid.Row="1" ItemsSource="{Binding Views}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:Window Title="Test" Width="300" Height="300" Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Top" Value="50"/>
<Setter Property="Canvas.Left" Value="50"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
但是当渲染每个项目时,它显示没有周围的Window内容控件。实际上它甚至没有命中Window构造函数。这告诉我,它忽略了DataTemplate,只是将usercontrol直接添加到画布,但我不确定原因。
有什么建议吗?
答案 0 :(得分:1)
已更新
在另一个堆栈线程Using binding to a List <UserControl>
how can I do for not showing the controls
基本上,当您绑定到<UserControl>
列表时已经找到,您会收到错误26,并忽略<DataTemplate>
。简单的解决方法是将<UserControl>
包装在另一个类中,以便它不会被检测为控件。然后,您可以使用包装器上的属性绑定<UserControl>
中的<DataTemplate>
。
所以详细说明我创建了一个包装类,如下所示:
public class ViewWrapper
{
public UserControl View { get; set; }
}
然后我更改了控件上的列表以使用ViewWrapper:
public ObservableCollection<ViewWrapper> ViewWrappers { get; set; }
现在我可以将我的列表绑定到<ItemsControl>
,而不会忽略我的<DataTemplate>
。我使用包装器的View属性来访问View。
<ItemsControl ItemsSource="{Binding ViewWrappers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<ContentControl Content="{Binding View}"/>
<Label Content="End of this item." />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>