Как мне устранить ошибку конструктора WPF 'Тип {0} не поддерживает прямое содержимое'.'?
-
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 и не смог правильно разобраться даже в такой простой вещи...В любом случае, преобразовать его несложно, так что - надеюсь, это поможет.