2008-12-10 29 views
2

Je souhaite ajouter un seul objet de modèle qui a été instancié une fois en XAML et l'ajouter à deux collections différentes (en xaml).XAML - StaticResources dans les initialiseurs de collection

Le code suivant rend bien dans le temps Design Blend, mais je reçois les erreurs suivantes lors de l'exécution:

Pour « Post1 »
objet de type « WpfBlog.Models.Tag » ne peut pas être converti en tapez 'System.Collections.ObjectModel.ObservableCollection`1 [WpfBlog.Models.Tag]'. Erreur à l'objet 'WpfBlog.Admin' dans le fichier de balisage 'WpfBlog; component/Admin.xaml' Ligne XX Position YY.

Si je commente sur « Post1 », je vais cette erreur sur « Post2 »
Impossible d'ajouter l'élément à la propriété « Tags », parce que la propriété ne peut avoir qu'un seul élément enfant si elle utilise une collection explicite marque. Erreur sur l'objet 'System.Windows.StaticResourceExtension' dans le fichier de marquage 'WpfBlog; component/Admin.xaml' Ligne AA Position BB.

<Window.Resources> 
    <model:Tag x:Key="TDD" Name="TDD" ForeColor="Black" BackColor="White" /> 
    <model:Tag x:Key="Agile" Name="Agile" ForeColor="White" BackColor="Black" /> 
    <model:Tag x:Key="Waterfail" Name="Waterfail" ForeColor="Red" BackColor="White" /> 
</Window.Resources> 
<Window.DataContext> 
    <local:AdminViewModel> 
     <local:AdminViewModel.AllTags> 
      <StaticResource ResourceKey="TDD"/> 
      <StaticResource ResourceKey="Agile"/> 
      <StaticResource ResourceKey="Waterfail"/> 
     </local:AdminViewModel.AllTags> 
     <local:AdminViewModel.Posts> 
      <local:PostViewModel Title="Post1"> 
       <local:PostViewModel.Tags> 
        <StaticResource ResourceKey="TDD" /> 
       </local:PostViewModel.Tags> 
      </local:PostViewModel> 
      <local:PostViewModel Title="Post2"> 
       <local:PostViewModel.Tags> 
        <StaticResource ResourceKey="TDD" /> 
        <StaticResource ResourceKey="Agile" /> 
        <StaticResource ResourceKey="Waterfail" /> 
       </local:PostViewModel.Tags> 
      </local:PostViewModel> 
     </local:AdminViewModel.Posts> 
    </local:AdminViewModel> 
<Window.DataContext> 

Le code suivant compile, et fonctionne très bien, mais deux balises nom se créé « TDD », donc si je tente de renommer l'étiquette, je dois le faire pour tous les postes, au lieu d'une Tag objet

<Window.Resources> 
    <model:Tag x:Key="TDD" Name="TDD" ForeColor="Black" BackColor="White" /> 
    <model:Tag x:Key="Agile" Name="Agile" ForeColor="White" BackColor="Black" /> 
    <model:Tag x:Key="Waterfail" Name="Waterfail" ForeColor="Red" BackColor="White" /> 
</Window.Resources> 
<Window.DataContext> 
    <local:AdminViewModel> 
     <local:AdminViewModel.AllTags> 
      <StaticResource ResourceKey="TDD"/> 
      <StaticResource ResourceKey="Agile"/> 
      <StaticResource ResourceKey="Waterfail"/> 
     </local:AdminViewModel.AllTags> 
     <local:AdminViewModel.Posts> 
      <local:PostViewModel Title="Post1"> 
       <local:PostViewModel.Tags> 
        <model:Tag Name="TDD" ForeColor="Black" BackColor="White" /> 
       </local:PostViewModel.Tags> 
      </local:PostViewModel> 
      <local:PostViewModel Title="Post2"> 
       <local:PostViewModel.Tags> 
        <model:Tag Name="TDD" ForeColor="Black" BackColor="White" /> 
        <model:Tag Name="Agile" ForeColor="White" BackColor="Black" /> 
        <model:Tag Name="Waterfail" ForeColor="Red" BackColor="White" /> 
       </local:PostViewModel.Tags> 
      </local:PostViewModel> 
     </local:AdminViewModel.Posts> 
    </local:AdminViewModel> 
<Window.DataContext> 

Des idées? Je serais capable de l'ignorer et de contourner le problème si Blend ne le rend pas correctement, mais c'est le cas!

Répondre

0

Ceci est très similaire au problème décrit dans this question, je pense.

La solution devrait être d'ajouter un attribut x: Shared = "False" à votre modèle <: Tag > éléments. Cela indique à WPF de ne pas partager une seule instance chaque fois qu'une référence est référencée et de créer de nouvelles instances.

4

J'ai réussi à éviter le problème en initialisant explicitement une nouvelle collection dans la propriété Tags. Quelque chose comme ceci:

<local:PostViewModel Title="Post1"> 
    <local:PostViewModel.Tags> 
    <model:TagCollection> 
     <StaticResource ResourceKey="TDD" /> 
    </model:TagCollection> 
    </local:PostViewModel.Tags> 

Évidemment, ceci n'est possible que si vous autorisez l'écriture de votre propriété Tags.