2008-12-10 25 views
6

El siguiente XAML (a continuación) define una colección personalizada en los recursos e intenta llenarla con un objeto personalizado;¿Cómo resuelvo el error de WPF Designer 'El tipo {0} no admite el contenido directo'. '?

<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> 

El problema es que me da un error en el diseñador de 'El tipo 'MyCustomCollection' no soporta el contenido directo'. Intenté configurar ContentProperty como se recomienda en MSDN, pero no puedo imaginarme cómo configurarlo. El objeto de colección personalizado que uso está debajo y es muy simple. Probé Item, Items y MyCustomItem y no puedo pensar qué más probar.

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

Cualquier pista sobre dónde estoy yendo mal sería gratamente recibida. También sugiere cómo profundizar en el modelo de objetos de WPF para ver qué propiedades están expuestas en el tiempo de ejecución, y también podría descubrirlo de esa manera.

Saludos

Ryan

Respuesta

5

Usted tiene que inicializar el ContentPropertyAttribute con el nombre de la propiedad que va a representar el contenido de su clase. En su caso, porque hereda de ObservableCollection, esa sería la propiedad Artículos. Lamentablemente, la propiedad Elementos es de solo lectura y no está permitida porque la propiedad Contenido debe tener un configurador. Así que hay que definir una propiedad personalizada envoltura alrededor de los elementos y el uso que en su atributo - de este modo:

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); 
      } 
     } 
    } 
} 

y que debe estar bien. Perdón por hacer eso en C# cuando tu ejemplo está en VB, pero realmente apestaba con VB y no podía ni siquiera hacer algo tan simple ... De todos modos, es muy fácil convertirlo, así que espero que eso ayude.

+0

Se ve bien, pero una pregunta acerca de su setter allí. ¿No agregaría eso continuamente a la colección y causaría una excepción? Además, ¿por qué IList y no ObservableCollection? Gracias –

+0

No, agregará solo la cantidad de elementos que tenga en la variable de valor entrante, y esos son los valores que define en XAML. Y es IList , porque ese es el tipo de propiedad de Artículos. Recuerde, el contenedor es para la propiedad Artículos, no para toda la clase. – Boyan

+0

Gracias, eso es un excelente consejo. Muy apreciado. –

Cuestiones relacionadas