2010-10-15 7 views
2

Je souhaite définir un ItemTimplate en fonction de certaines propriétés. Je viens de créer un balisage, où je mets ItemTemplate comme ceci:Silverlight ItemTemplate binding

<controls:Panorama Title="Some Title" ItemsSource="{Binding Modules}" ItemTemplate="{Binding Id, Converter={StaticResource ControlTemplateConverter}}"> 

    <controls:Panorama.Background> 
     <ImageBrush ImageSource="PanoramaBackground.png"/> 
    </controls:Panorama.Background> 

</controls:Panorama> 

et mettre en œuvre ControlTemplateConverter comme ceci:

public class ControlTemplateConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     StringBuilder sbTemp = new StringBuilder(); 
     sbTemp.Append("<DataTemplate "); 
     sbTemp.Appen("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' "); 
     sbTemp.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' "); 
     sbTemp.Append("<StackPanel>"); 
     sbTemp.Append("<TextBlock Text=\"News News\" />"); 
     sbTemp.Append("</StackPanel>"); 
     sbTemp.Append("</DataTemplate>"); 
     return (DataTemplate)XamlReader.Load(sbTemp.ToString()); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Je me suis inscrit un convertisseur:

<UserControl.Resources> 
    <converter:ControlTemplateConverter x:Key="ControlTemplateConverter" /> 
</UserControl.Resources> 

Mais quand J'ai mis un point d'arrêt dans ControlTemplateConverter.Convert, il ne s'arrête jamais dans le débogage. ItemSource se charge à chaque fois. Qu'est-ce qui ne va pas? Merci.

+0

Pourquoi avez-vous besoin d'un convertisseur? Ne pouvez-vous pas déclarer votre modèle en XAML? –

+0

Je veux obtenir une liaison dynamique de itemtemplate. Si une propriété est égale à 1, que je veux voir un modèle et etc. Comprenez-vous? J'étudie, que lorsque j'ai défini ItemTemplate comme ceci ItemTemplate = "{Binding Converter = {StaticResource ControlTemplateConverter}}" (sans Id), tout fonctionne bien (convertisseur fonctionne), mais maintenant je ne sais pas comment passer une variable nécessaire. Comment puis-je faire ceci? – SuperXMan

Répondre

0

Je suspecte que la liaison ne parvient pas à trouver la propriété Id dans le même DataContext que la propriété Modules est trouvée. Par conséquent, il n'y a pas d'appel au convertisseur. C'est probablement parce que Id est en fait une propriété de chaque Module et en quelque sorte vous imaginez que la liaison ItemTemplate est résolue pour chaque élément. Ce n'est pas le cas. Vous avez un modèle qui est appliqué à tous les éléments du ItemsSource.

+0

Lorsque je supprime l'ID de la liaison dans le convertisseur, je reçois le parent des modules. Comment puis-je obtenir un contexte d'objet de liaison ou comment puis-je lier un modèle en fonction de la propriété d'un objet d'une autre manière? – SuperXMan

Questions connexes