Firedragon
Firedragon

Reputation: 3733

How to set DataTemplate for class inheriting more than one interface?

I am trying to use an MVVM architecture and MEF in order to build by application. I want to use DataTemplates and ContentControls in order to allow my application to display to the user in as generic a way as possible.

So I am now creating the ability for a user to read/write information and read/write results to somewhere, could be XML, could be a database. So I have two interfaces IResultStorage and ITestStorage

I now want to create a page for the user to update settings for these, so file location or database etc. My view model imports them via MEF:

public sealed class AdminViewModel : ViewModelBase
{
    [Import]
    public ITestStorage TestStorage { get; set; }

    [Import]
    public IResultStorage ResultStorage { get; set; }
}

Then the view is exported and loaded into the Resources.MergedDictionaries at run time

<DataTemplate DataType="{x:Type vm:AdminViewModel}">
    <Grid>
        <TabControl Grid.Row="0">
            <TabItem Header="Tests">
                <ContentControl Grid.Row="0" Content="{Binding TestStorage}"/>
            </TabItem>
            <TabItem Header="Results">
                <ContentControl Grid.Row="0" Content="{Binding ResultStorage}"/>
            </TabItem>
        </TabControl>
    </Grid>
</DataTemplate>

However, the way I currently have it implemented is that one class has inherited both of these and it is this that is causing me problems:

[Export(typeof(ITestStorage))]
[Export(typeof(IResultStorage))]
public sealed class XmlStorage : ITestStorage, IResultStorage { ... }

So when the AdminViewModel above gets drawn both ContentControls are of type XmlStorage it seems so I don't know how to create DataTemplates to draw them properly.

Hopefully this makes sense, if I have done it totally the wrong way it would be good to know.

Upvotes: 4

Views: 143

Answers (2)

WiiMaxx
WiiMaxx

Reputation: 5420

have you testet if you create subDatatemplates for each as Resourse?

<DataTemplate DataType="{x:Type vm:TestStorage}">
    <Grid>
        <Label Content="{Binding someValueFromTestStorage}"/>
    </Grid>
</DataTemplate>

EDIT

maybe this 2 links could help you First, Second (ger)

also this link could be interesting follow Beatriz Costa - MSFT (Partner)

Upvotes: 1

DHN
DHN

Reputation: 4865

Well for a more tricky implementation, let us called it more intelligent implementation I would suggest a TemplateSelector. For more information please have look here.

You will be able to assign templates based on the type of the given VM or business object. The only challenge you will face is the fact that you have to find out in which 'role' the object is passed to the TemplateSelector.

Additional info

I think this will help you, too.

Upvotes: 1

Related Questions