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