Как мне устранить ошибку конструктора WPF 'Тип {0} не поддерживает прямое содержимое'.'?

StackOverflow https://stackoverflow.com/questions/356663

  •  21-08-2019
  •  | 
  •  

Вопрос

Следующий XAML (ниже) определяет пользовательскую коллекцию в resources и пытается заполнить ее пользовательским объектом;

<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, чтобы увидеть, какие свойства отображаются во время выполнения, возможно, я тоже смогу разобраться с этим таким образом.

С уважением

Райан

Это было полезно?

Решение

Вы должны инициализировать 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);
            }
       }
    }
}

И с тобой должно быть все в порядке.Извините, что делаю это на C #, когда ваш пример находится на VB, но я действительно плохо разбираюсь в VB и не смог правильно разобраться даже в такой простой вещи...В любом случае, преобразовать его несложно, так что - надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top