Search code examples
wpfwindows-phone-8bindingitemtemplatestaticresource

Binding to Static Resource via Name


I get next templates:

<Page.Resources>
   <DataTemplate x:Key="T1">...</DataTemplate>
   <DataTemplate x:Key="T2">...</DataTemplate>
   <DataTemplate x:Key="T3">...</DataTemplate>
</Page.Resources>

and a list of items:

class SampleItem {
 ...
 public string ItemTemplateName { get; set; }
}

and I'm dreaming to use it in the next way:

<ListView
   ItemTemplate = "{StaticResource {Binding ItemTemplateName}}">
</ListView> 

Is this possible to do something like that? And that will be the right binding for this case?

Thank you!


Solution

  • please try to use the template selector in this case.

    XAML Page resources changes

        <DataTemplate x:Key="T1">
            <Rectangle Fill="Tomato" Width="50" Height="50"></Rectangle>
        </DataTemplate>
        <DataTemplate x:Key="T2">
            <Rectangle Fill="Green" Width="50" Height="50"></Rectangle>
        </DataTemplate>
        <DataTemplate x:Key="T3">
            <Rectangle Fill="Blue" Width="50" Height="50"></Rectangle>
        </DataTemplate>
        <gridbackgroundProblemSoHelpAttempt:MyTemplateSelector x:Key="MyTemplateSelector" 
                                                               ADataTemplate="{StaticResource T1}"
                                                               BDataTemplate="{StaticResource T2}"
                                                               CDataTemplate="{StaticResource T3}"/>
    

    Xaml ListView changes (please note that the SampleItems is an ObservableCollection of SampleItem objects)

    <ListView ItemsSource="{Binding SampleItems}" ItemTemplateSelector="{StaticResource MyTemplateSelector}"/>
    

    MyTemplateSelector code

     public class MyTemplateSelector : DataTemplateSelector
    {
        public DataTemplate ADataTemplate { get; set; }
        public DataTemplate BDataTemplate { get; set; }
        public DataTemplate CDataTemplate { get; set; }
    
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var si = item as SampleItem;
            if (si == null) return null;
            var key = si.ItemTemplateName;
    
            switch (key)
            {
                case "A":
                {
                    return ADataTemplate;
                }
                    break;
                case "B":
                {
                    return BDataTemplate;
                }
                    break;
                case "C":
                {
                    return CDataTemplate;
                }
                    break;
    
                default:
                    throw new ArgumentOutOfRangeException();
            }
    
        }
    }
    

    Page DataContext

    public class MainViewModel
    {
        public MainViewModel()
        {
            SampleItems = new ObservableCollection<SampleItem>
            {
                new SampleItem{ItemTemplateName = "A"},
                new SampleItem{ItemTemplateName = "B"},
                new SampleItem{ItemTemplateName = "C"},
    
            };
        }
        public ObservableCollection<SampleItem> SampleItems { get; set; }
    }
    

    Regards,