Как устранить ошибку дизайнера WPF «Тип {0} не поддерживает прямой контент». »? - PullRequest
7 голосов
/ 10 декабря 2008

Следующий 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» не поддерживает прямой контент ». Я попытался установить ContentProperty, как советовали в MSDN, но не могу понять, на что его установить. Пользовательский объект коллекции, который я использую, находится ниже и очень прост. Я пробовал Item, Items и MyCustomItem и не могу придумать, что еще можно попробовать.

<ContentProperty("WhatGoesHere?")> _
Public Class MyCustomCollection
    Inherits ObservableCollection(Of MyCustomItem)
End Class

Любые подсказки о том, где я иду не так, будут с благодарностью приняты. Также подсказки о том, как копаться в объектной модели WPF, чтобы увидеть, какие свойства предоставляются во время выполнения, возможно, я тоже смогу это выяснить.

Привет

Ryan

1 Ответ

5 голосов
/ 10 декабря 2008

Вы должны инициализировать ContentPropertyAttribute с именем свойства, которое будет представлять содержимое вашего класса. В вашем случае, поскольку вы наследуете от ObservableCollection, это будет свойство Items. К сожалению, свойство Items доступно только для чтения, и это недопустимо, поскольку свойство Content должно иметь установщик. Таким образом, вы должны определить собственное свойство-оболочку для 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 и не могу понять даже такую ​​простую вещь правильно ... В любом случае, преобразовать это совсем несложно, так что - надеюсь, это поможет. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...