Search code examples
wpfxamlobjectobjectdataproviderinstances

Instantiate and reuse instances of objects in XAML


I want to instantiate objects in XAML, and reuse these instances. I think it should be simple but I'm stuck, I'm probably missing something obvious.

Say I want to add Cats to different Rooms (Room has an ObservableCollection containing objects of type Cat). In the UserControl.Resources I create 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>

In my UserControl I want to add the Cats to the Rooms:

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

What is the syntax for adding the Cat instances to the ObservableCollection Room.Cats? For instance I want to add Cat1 and Cat2 to Room1, and Cat2 and Cat3 to Room2. Am I completely on the wrong track?


Solution

  • Based on the feedback from Heinzi and Robert Rossney I came up with the following solution that works with an ObservableCollection that I can access in XAML and code behind:

    In code I extended ObservableCollection so I can use it in XAML (this will no longer be necessary in XAML 2009):

    public class CatObservableCollection : ObservableCollection<Cat> { }
    

    In XAML in the UserControl.Resources I instantiate the Cats:

    <local:Cat x:Key="Tom" Name="Tom"/>
    <local:Cat x:Key="Garfield" Name="Garfield"/>
    <local:Cat x:Key="Furball" Name="Furball"/>
    

    The collections:

    <local:CatObservableCollection x:Key="Room1Collection">
        <StaticResourceExtension ResourceKey="Tom"/>
        <StaticResourceExtension ResourceKey="Garfield"/>
    </local:CatObservableCollection>
    <local:CatObservableCollection x:Key="Room2Collection">
        <StaticResourceExtension ResourceKey="Garfield"/>
        <StaticResourceExtension ResourceKey="Furball"/>
    </local:CatObservableCollection>
    

    The Rooms are now defined as follows:

    <local:Room x:Name="Room1" Cats="{StaticResource Room1Collection}"/>
    <local:Room x:Name="Room2" Cats="{StaticResource Room2Collection}"/>
    

    Room.Cats is an ObservableCollection<Cat>