2008-12-10 4 views
6

Das folgende XAML (unten) definiert eine benutzerdefinierte Sammlung in Ressourcen und versucht, sie mit einem benutzerdefinierten Objekt aufzufüllen;Wie behebe ich den WPF-Designer-Fehler 'Der Typ {0} unterstützt keinen direkten Inhalt'. '?

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

Das Problem ist, dass ich einen Fehler in dem Designer von ‚Der Typ‚MyCustomCollection‘nicht direkt Inhalte unterstützt die‘ erhalten. Ich habe versucht, ContentProperty so einzustellen, wie es in MSDN empfohlen wird, kann aber nicht herausfinden, auf was es eingestellt werden soll. Das benutzerdefinierte Objekt, das ich verwende, ist unten und ist sehr einfach. Ich habe Item, Items und MyCustomItem ausprobiert und kann mir nicht vorstellen, was ich sonst noch versuchen soll.

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

Irgendwelche Hinweise darauf, wo ich falsch werde dankbar empfangen werden würde. Es gibt auch Hinweise darauf, wie Sie sich in das WPF-Objektmodell einarbeiten, um zu sehen, welche Eigenschaften zur Laufzeit verfügbar sind. Vielleicht kann ich es auch so herausfinden.

Grüße

Ryan

Antwort

5

Sie haben den Content mit dem Namen der Eigenschaft zu initialisieren, den Inhalt Ihrer Klasse repräsentieren geht. In Ihrem Fall wäre dies die Items-Eigenschaft, weil Sie von ObservableCollection erben. Leider ist die Items-Eigenschaft schreibgeschützt und das ist nicht zulässig, da die Content-Eigenschaft einen Setter haben muss. So haben Sie eine benutzerdefinierten Wrapper Eigenschaft um Elemente zu definieren und verwenden, die in Ihrem Attribute - etwa so:

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

Und Sie sollten alles in Ordnung sein. Tut mir leid, dass ich das in C# gemacht habe, wenn dein Beispiel in VB ist, aber ich bin wirklich sauer auf VB und konnte nicht einmal eine so einfache Sache richtig machen ... Wie auch immer, es ist ein Kinderspiel, es zu konvertieren, also hoffe das hilft.

+0

Sieht gut aus, aber eine Frage zu Ihrem Setter dort. Würde das nicht ständig zur Sammlung hinzufügen und eine Ausnahme verursachen? Auch warum IList und nicht ObservableCollection? Danke –

+0

Nein, es werden nur so viele Elemente hinzugefügt wie in der Variable für den eingehenden Wert - und das sind die Werte, die Sie in XAML definieren. Und es ist IList , weil das der Typ der Items-Eigenschaft ist. Denken Sie daran, dass der Wrapper für die Items-Eigenschaft und nicht für die gesamte Klasse bestimmt ist. – Boyan

+0

Danke, das ist ein ausgezeichneter Rat. Sehr geschätzt. –

Verwandte Themen