我该如何解决WPF设计师错误“类型{0}不支持直接内容”?

7
以下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

任何关于我做错了什么的线索都将不胜感激。同时,如果有关于如何深入挖掘WPF对象模型以查看运行时公开的属性的提示,那也将非常有帮助,我可能可以通过这种方式找到答案。
谢谢,
Ryan
1个回答

5

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

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);
            }
       }
    }
}

你应该没问题了。很抱歉我用C#来做这个示例,而你的示例是用VB写的,但我真的不擅长VB,甚至不能正确地完成这么简单的事情...无论如何,将其转换非常容易,所以希望这可以帮到你。


看起来不错,但是你的 setter 有一个问题。那样不会一直添加到集合中并导致异常吗?另外,为什么要使用 IList 而不是 ObservableCollection? - Ryan O'Neill
不,它只会添加与传入值变量中定义的值相同数量的项 - 而这些值是在XAML中定义的。而且它是IList<T>,因为这是Items属性的类型。请记住,包装器是用于Items属性,而不是整个类。 - Boyan
现在我得到设计者中的“这个项目代表一个默认值,不能更改。”也许我需要使用setter语法。 - Ryan O'Neill
我没有遇到那个错误,但我不知道你具体想做什么。你能具体说明一下吗? - Boyan
然而,这里还有另一个问题。Content属性仅允许单个内容 - 因此,如果您尝试将第二个MyCustomItem放入XAML中,将会出现错误。如果这并不无关紧要,您应该寻找另一种解决方案,不使用ContentPropertyAttribute。 - Boyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接