2016-02-01 4 views
0

Я получаю следующие шаблоны:Привязка к статическому ресурсу с помощью имени

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

и список элементов:

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

и я мечтал, чтобы использовать его в следующем виде:

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

Возможно ли это сделать? И это будет правильным обязательством для этого случая?

Спасибо!

+0

В текущий 'ListView' вы должны использовать' 'DataTemplate' для ItemTemplate', так что используйте' {StaticResource {Binding T1}} ' например. Ваш смысл 'ItemTemplateName' неясен. – AnjumSKhan

ответ

0

попробуйте использовать селектор шаблонов в этом случае.

ресурсы

XAML Страница изменения

<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 (обратите внимание, что SampleItems является ObservableCollection объектов SampleItem)

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

MyTemplateSelector код

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

С уважением,

+0

Спасибо за ответ! Это блестящая идея. – Melany

+0

@Melany, пожалуйста. – Ilan