Como faço para resolver o erro Designer WPF 'O tipo {0} não suporta conteúdo direto'. '?

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

  •  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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top