2010-09-26 4 views
1

Ok, donc j'ai essayé de mettre en œuvre un CoverFlow trouvé sur CodePlex http://silverlightcoverflow.codeplex.com/Silverlight Reliure Edition

Je voulais utiliser ma propre classe pour la liaison de données:

class CoverItem 
    { 
     BitmapImage _image; 
     string _title; 
     string _link; 
     string _content; 

     public BitmapImage Image 
     { 
      get { return _image; } 
      set { _image = value; } 
     } 

     public string Title 
     { 
      get { return _title; } 
      set { _title = value; } 
     } 

     public string Link 
     { 
      get { return _link; } 
      set { _link = value; } 
     } 

     public string Content 
     { 
      get { return _content; } 
      set { _content = value; } 
     } 
    } 

C'est le XAML pour l'utilisateur couverture contrôle de CodePlex:

<custom:CoverFlowControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <Image Source="{Binding Image}" Width="300" /> 
      <TextBlock Text="{Binding Title}" Width="300" /> 
      <TextBlock Text="Testing" Width="300" /> 
     </StackPanel> 
    </DataTemplate> 
</custom:CoverFlowControl.ItemTemplate> 

le problème que j'ai est que je reçois mot « test » pour chaque élément qui était lié, mais je ne reçois pas l'image ou le titre, qui sont fr om mes objets attachés à la propriété ItemSource du contrôle.

Covers.ItemsSource = _items; 

Ma question est, où je vais mal? Cela devrait être une simple liaison, alors pensez que je manque quelque chose.

Merci d'avance pour l'aide.

EDIT:

Si je change le code à ceci:

List<BitmapImage> images = new List<BitmapImage>() { _items[0].Image, _items[1].Image, _items[2].Image, _items[3].Image }; 

Covers.ItemsSource = images;// _items; 

Et puis ai la liaison comme ceci:

<Image Source="{Binding}" Width="300" /> 

Je reçois maintenant mes images d'affichage. Donc, je sais que c'est un problème avec la liaison quelque part.

ont également essayé

<Image Source="{Binding Path=Image}" Width="300" /> 
+0

De quel type de liste il s'agit _items et quand/comment est-il créé? Quand les CoverItems individuels sont-ils ajoutés à la liste? –

+0

private Liste _items = new Liste (); – jimplode

+0

Ils sont remplis à partir du contenu d'un fichier XML en utilisant un xmlreader, mais ce n'est pas important – jimplode

Répondre

4

Rendez la classe CoverItem publique. L'un des inconvénients de Silverlight est que l'autorisation de réflexion sur les types internes entre les assemblys n'est pas autorisée. Lors de la liaison aux propriétés CLR, la réflexion est utilisée pour obtenir la valeur. L'assembly qui essaie d'obtenir la valeur est System.Windows et il n'aura pas l'autorisation de refléter un type interne dans votre assembly.

J'ai écrit à ce sujet dans le contexte des types anonymes (qui sont des types internes): http://surrealization.com/blog/silverlight-anonymous-type-binding-gotcha/

Alternativement, vous pouvez fournir un attribut InternalsVisibleTo sur votre assemblage pour permettre System.Windows de « voir » votre type interne .
http://grahammurray.wordpress.com/2010/05/30/binding-to-anonymous-types-in-silverlight/

Pour de-la-bouche Description pour chevaux, voir ce lien MSDN:
http://msdn.microsoft.com/en-us/library/stfy7tfc(VS.95).aspx

Dans Silverlight, vous ne pouvez pas utiliser réflexion pour accéder à des types particuliers et membres. Si le niveau d'accès d'un type ou d'un membre vous empêche d'accéder à dans le code statiquement compilé, vous ne pouvez pas y accéder dynamiquement en utilisant la réflexion.

Et
http://connect.microsoft.com/VisualStudio/feedback/details/526229/in-silverlight-4-binding-to-an-internal-data-by-code-doesnt-work

Silverlight prend en charge la liaison à publics types seulement.

+0

Je t'aime !! Trié mon problème, je ne peux pas croire que je n'ai pas pensé à essayer ça !! Merci beaucoup!! – jimplode

0

Je n'ai pas vérifié ce projet CoverFlow encore sorti, mais de la façon dont vous définissez les liaisons dans votre XAML, la propriété Image dans votre modèle est habituellement devrait être un Uri au lieu d'un contrôle d'image réel:

public Uri Image { get; set; } // should also be renamed to ImageUri 

C'est plus propre quand même. Si vous devez vraiment, vraiment utiliser un vrai Image dans votre modèle, vous devrez définir un ContentPresenter dans votre XAML.

Quant à pourquoi le Title ne s'afficherait pas, je ne sais pas.

+0

Cela a le même effet, même en utilisant un Uri avec la liaison ne renvoie rien. Comme vous je suis confus pourquoi le texte ne fonctionne pas. La liaison dans XAML m'a toujours dérouté. :/ – jimplode