Como faço para resolver o erro Designer WPF 'O tipo {0} não suporta conteúdo direto'. '?
-
21-08-2019 - |
Pergunta
O XAML seguinte (abaixo) define uma coleção personalizada em recursos e tentativas de preenchê-lo com um objeto personalizado;
<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>
O problema é que eu recebo um erro no designer de 'O tipo 'MyCustomCollection' não suporta conteúdo direto'. Eu tentei configuração ContentProperty como recomendado no MSDN, mas não consigo descobrir o que configurá-lo para. O objeto de coleção personalizada que eu uso é baixo e é muito simples. Eu tentei item, itens e MyCustomItem e não pode pensar em mais o que tentar.
<ContentProperty("WhatGoesHere?")> _
Public Class MyCustomCollection
Inherits ObservableCollection(Of MyCustomItem)
End Class
Qualquer pistas como para onde estou indo errado seria recebido com gratidão. Também dicas sobre como cavar o modelo WPF objeto para ver quais propriedades estão expostos em tempo de execução, eu poderia ser capaz de descobrir isso dessa forma também.
Saudações
Ryan
Solução
Você tem que inicializar o ContentPropertyAttribute com o nome da propriedade que vai representar o conteúdo de sua classe. No seu caso, porque você herdar de ObservableCollection, que seria a propriedade Items. Infelizmente, a propriedade Items é somente leitura e que não é permitido, porque a propriedade de conteúdo deve ter um setter. Então você tem que definir uma propriedade wrapper personalizado em torno de itens e usar isso em seu atributo - como assim:
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);
}
}
}
}
E você deve estar tudo certo. Desculpe por fazer isso em C # quando o seu exemplo é em VB, mas eu realmente chupar a VB e não poderia chegar até mesmo um tão simples coisa certa ... Enfim, é uma pressão para convertê-lo, então -. Espero que ajude