2016-02-01 1 views
0

Je reçois des modèles suivants:Liaison à des ressources via statique Nom

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

et une liste d'éléments:

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

et je rêve de l'utiliser dans la prochaine façon:

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

Est-ce possible de faire quelque chose comme ça? Et ce sera la bonne liaison pour cette affaire?

Merci!

+0

Dans votre position actuelle 'ListView' vous devez utiliser un' 'DataTemplate' pour ItemTemplate', alors utilisez' {{StaticResource Binding T1}} ' par exemple. Votre sens de 'ItemTemplateName' n'est pas clair. – AnjumSKhan

Répondre

0

Veuillez essayer d'utiliser le sélecteur de modèle dans ce cas.

XAML page Ressources changements

<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 changements ListView (s'il vous plaît noter que le SampleItems est un ObservableCollection d'objets SampleItem)

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

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

Cordialement,

+0

Merci pour la réponse! C'est une bonne idée. – Melany

+0

@Melany vous êtes les bienvenus. – Ilan