Instancier et de la réutilisation des instances d'objets en XAML
Je veux instancier des objets dans le code XAML, et la réutilisation de ces instances. Je pense que ça doit être simple mais je suis coincé, je suis probablement manquer quelque chose d'évident.
Dire, je veux ajouter des Chats de différentes pièces (Chambre dispose d'une ObservableCollection contenant des objets de type Cat). Dans le UserControl.Ressources-je créer ObjectDataProviders:
<ObjectDataProvider x:Key="Cat1" ObjectType="{x:Type local:Cat}">
<ObjectDataProvider.ConstructorParameters>
<System:String>Tom</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="Cat2" ObjectType="{x:Type local:Cat}">
<ObjectDataProvider.ConstructorParameters>
<System:String>Garfield</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="Cat3" ObjectType="{x:Type local:Cat}">
<ObjectDataProvider.ConstructorParameters>
<System:String>Furball</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
Dans mon UserControl je veux ajouter les Chats, dans les Chambres:
<local:Room x:Name="Room1">
<local:Room.Cats>
</local:Room.Cats>
<local:Room>
<local:Room x:Name="Room2">
<local:Room.Cats>
</local:Room.Cats>
<local:Room>
Quelle est la syntaxe pour ajouter les instances de Cat à l'ObservableCollection Chambre.Les chats? Par exemple je veux ajouter Cat1 et Cat2 à Room1, et Cat2 et Cat3 à Room2. Suis-je complètement sur la mauvaise voie?
<StaticResource ResourceKey="Cat1" />
à votre liste de Chats. Depuis je n'ai pas la possibilité de tester cela pour le moment, je suis seulement en ajoutant un commentaire...J'ai essayé, ça compile, mais l'exécution, il donne un XamlParseException: Objet de type 'System.De Windows.Les données.ObjectDataProvider " ne peuvent pas être convertis en type 'System.Les Collections.ObjectModel.ObservableCollection`1[Chat]'
Je vois. La prochaine chose que je voudrais faire est d'essayer de (a) créer une ObservableCollection en XAML à l'intérieur de
<local:Room.Cats>
(voir les "Notes sur l'utilisation de XAML" dans le msdn.microsoft.com/en-us/library/ms668604.aspx) et ensuite (b) remplacer le ObjectDataProvider
par un Cat
(c'est à dire <local:Cat Name="Garfield" x:Key="Cat1">
) puis ajouter le StaticResource pointant vers le Chat à l'intérieur de votre ObservableCollection. Toutefois, cela nécessiterait de votre Cat
classe d'avoir un constructeur sans paramètre.
OriginalL'auteur eriksmith200 | 2010-10-01
Vous devez vous connecter pour publier un commentaire.
La réutilisation des instances individuelles de la façon dont vous essayez de faire, c'est délicat. C'est parce que la façon dont vous généralement référence des objets uniques dans le code XAML est avec le
StaticResource
extension de balisage, et vous ne pouvez utiliser que l'extension de balisage pour définir la valeur d'une propriété.De sorte que vous pouvez facilement définir une propriété de type
Cat
à une instance d'unCat
:mais vous ne pouvez pas remplir une collecte par la définition d'une propriété.
La réponse, étonnamment, est d'instancier vos objets directement dans le code XAML au lieu de les emballer dans des
ObjectDataProvider
s. Vous utilisez toujours laObjectDataProvider
, mais différemment:OriginalL'auteur Robert Rossney
Sur la base des commentaires de Heinzi et Robert Rossney je suis venu avec la solution suivante qui fonctionne avec une ObservableCollection que je peux accéder en XAML et le code behind:
Dans le code, j'ai étendu ObservableCollection donc je peux l'utiliser dans le code XAML (ce ne sera plus nécessaire dans le code XAML 2009):
En XAML dans le contrôle UserControl.Ressources je instancier les Chats:
Les collections:
Les Chambres sont maintenant définis comme suit:
Chambre.Les chats est une ObservableCollection<Cat>
OriginalL'auteur eriksmith200
Pour vos besoins spécifiques, vous allez faire des génériques. Et à utiliser des génériques de manière déclarative, vous devez utiliser x:TypeArguments Directive. TypeArguments directive peut être utilisé uniquement avec de l'élément racine. Donc, vous devez maintenant passer lâche fichier XAML. Un lâche fichier XAML peut être lu à l'aide de
System.Windows.Markup.XamlReader.Load(Stream Stream) method
Chat.cs :
Chambre.cs :
Classe de fenêtre :
Donc, votre .fichier txt contenant le code XAML serait :
OriginalL'auteur AnjumSKhan