如何解决WPF设计器错误';类型{0}不支持直接内容';?

如何解决WPF设计器错误';类型{0}不支持直接内容';?,wpf,designer,contentproperty,Wpf,Designer,Contentproperty,下面的XAML(如下)在资源中定义了一个自定义集合,并尝试用自定义对象填充它 <UserControl x:Class="ImageListView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300" xmlns:local="

下面的XAML(如下)在资源中定义了一个自定义集合,并尝试用自定义对象填充它

<UserControl x:Class="ImageListView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300"
    xmlns:local="clr-namespace:MyControls" >
    <UserControl.Resources>
        <local:MyCustomCollection x:Key="MyKey">
            <local:MyCustomItem>
            </local:MyCustomItem>
        </local:MyCustomCollection>
    </UserControl.Resources>
</UserControl>

问题是,我在“MyCustomCollection类型不支持直接内容”的设计器中遇到错误。我已尝试按照MSDN中的建议设置ContentProperty,但不知道该设置什么。下面是我使用的自定义集合对象,它非常简单。我试过Item、Items和MyCustomItem,想不出还有什么可以尝试的

<ContentProperty("WhatGoesHere?")> _
Public Class MyCustomCollection
    Inherits ObservableCollection(Of MyCustomItem)
End Class
_
公共类MyCustomCollection
继承(MyCustomItem的)ObservableCollection
末级
任何关于我哪里出了问题的线索都将不胜感激。另外,关于如何深入研究WPF对象模型以查看在运行时公开哪些属性的提示,我也可以通过这种方式找到答案

问候


Ryan

必须使用表示类内容的属性的名称初始化ContentPropertyAttribute。在您的情况下,因为您从ObservableCollection继承,所以这将是Items属性。不幸的是,Items属性是只读的,这是不允许的,因为Content属性必须具有setter。因此,您必须围绕项定义一个自定义包装器属性,并在属性中使用该属性,如下所示:

public class MyCustomItem
{ }

[ContentProperty("MyItems")]
public class MyCustomCollection : ObservableCollection<MyCustomItem>
{
    public IList<MyCustomItem> MyItems
    {
        get { return Items; }
        set 
        {
            foreach (MyCustomItem item in value)
            {
                Items.Add(item);
            }
       }
    }
}
公共类MyCustomItem
{ }
[内容属性(“MyItems”)]
公共类MyCustomCollection:ObservableCollection
{
公共物品
{
获取{返回项;}
设置
{
foreach(值中的MyCustomItem)
{
项目。添加(项目);
}
}
}
}

你应该没事的。很抱歉在C#中这样做,当你的例子是在VB中,但我真的很烂的VB,甚至不能得到这样一个简单的事情是正确的。。。无论如何,转换它很容易,所以-希望这会有帮助。

看起来不错,但是有一个关于你的二传手的问题。这不就是不断地添加到集合中并导致异常吗?还有,为什么是IList而不是ObservableCollection?谢天谢地,它只会在传入的值变量中添加尽可能多的项,这些是您在XAML中定义的值。它是IList,因为这是Items属性的类型。请记住,包装器是针对Items属性的,而不是针对整个类。继续,我现在在设计器中得到“此项表示默认值,无法更改”。也许我需要使用setter语法。我不知道这个错误,但我不知道你到底想做什么。你能具体说明一下吗?不过还有一个问题。Content属性只允许一段内容,因此如果您尝试在XAML中放置第二个MyCustomItem,您将得到一个错误。如果这不是无关紧要的,那么您应该寻找另一个解决方案,一个不使用ContentPropertyAttribute的解决方案。