通过ItemsControl在Canvas中呈现WPF自定义控件时出现问题

时间:2014-09-17 16:30:03

标签: c# wpf canvas itemscontrol

我想在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直接添加到画布,但我不确定原因。

有什么建议吗?

1 个答案:

答案 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>