View Injection inside ItemsControl

2019-07-20 08:50发布

In my application, I'm dealing with an ItemControl. This itemControl receives an ObservableCollection.

As you can see above, BaseItemViewModel is an abstract class. And when my application is launching, moduleCatalog loads the modules by discovery.

Each module has a class inherited from BaseItemViewModel

So I can't set the dataTemplates in ItemsControl like this:

<DataTemplate> 
    <View:GeneralSettingsView/> 
</DataTemplate> 
<DataTemplate> 
    <View:AdvancedSettingsView/> 
</DataTemplate> 

What can I do to show the view from the respective view model if I'm using Module Discovery?

1条回答
聊天终结者
2楼-- · 2019-07-20 09:32

Have you looked at the ItemTemplateSelector property?

For example, create a content selector class:

public class myContentSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item != null)
        {
            VMBase vm = item as VMBase;

            switch (vm.Type)
            {
                case myType.General:
                    return Application.Current.Resources["GeneralSettings"] as DataTemplate;
                default:
                    return Application.Current.Resources["AdvancedSettings"] as DataTemplate;
            }
        }

        return null;
    }
}

Create a static resource for it:

<local:myContentSelector x:Key="contentSelector" />

And set in the ItemsControl:

<ItemsControl ItemsSource="{Binding mySource}" ItemTemplateSelector="{StaticResource contentSelector}" />

And set your datatemplates to the names:

<DataTemplate x:Key="GeneralSettings" DataType="{x:Type vm:VMBase}"> 
    <View:GeneralSettingsView/> 
</DataTemplate> 
<DataTemplate x:Key="AdvancedSettings" DataType="{x:Type vm:VMBase}"> 
    <View:AdvancedSettingsView/> 
</DataTemplate> 

Something like that?

查看更多
登录 后发表回答