2010-04-15 4 views
2

J'ai donc une Listbox, qui utilise un ItemTemplate pour afficher une image. Je veux être en mesure de changer la taille de l'image affichée dans le ItemTemplate. Grâce à la liaison de données, je peux changer la largeur, mais la seule façon de voir comment faire est d'ajouter une propriété (Say, ImageSize) à la classe à laquelle je suis lié et de changer chaque élément de la collection pour obtenir une nouvelle ImageSize. N'existe-t-il aucun moyen d'accéder à la propriété d'un élément dans ce Datatemplate?Existe-t-il un moyen de modifier par programme un Data/ItemTemplate dans Silverlight?

E.g.

<navigation:Page.Resources> 
    <DataTemplate x:Key="ListBoxItemTemplate">    
     <Viewbox Height="100" Width="100"> 
      <Image Source="{Binding Image}"/> 
     </Viewbox>    
    </DataTemplate>   
</navigation:Page.Resources> 
<Grid> 
    <ListBox ItemTemplate="{StaticResource ListBoxItemTemplate}" ItemSource="{Binding Collection}"/> 
</Grid> 

est-il de toute façon de définir la largeur et la hauteur du négatoscope sans lier une propriété à tous les éléments de la collection?

Répondre

3

Vous pouvez utiliser la liaison d'élément pour cela. Essayez quelque chose comme ceci:

<UserControl.Resources>   
    <DataTemplate x:Key="ListBoxItemTemplate">    
    <Viewbox Height="{Binding Value, ElementName=slider1}" 
      Width="{Binding Value, ElementName=slider1}"> 
     <Image Source="{Binding Image}"/> 
    </Viewbox>       
    </DataTemplate> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="205*" /> 
    <RowDefinition Height="95*" /> 
    </Grid.RowDefinitions> 
    <ListBox ItemTemplate="{StaticResource ListBoxItemTemplate}" 
      ItemSource="{Binding Collection}"/> 
    <Slider x:Name="slider1" Value="100" Maximum="250" Grid.Row="1"/> 
</Grid> 
+0

Les liaisons ElementName ne fonctionnent que dans Silverlight 3 et supérieur. Comme il utilise silverlight 4, cela devrait fonctionner! :) – Arcturus

+0

Donc, en utilisant cela, je pourrais avoir une Textbox cachée ou quelque chose et l'utiliser pour mettre à jour le modèle par programmation? Ou est-ce hacky et il y a une meilleure façon de le faire? –

+0

Je pense que vous pourriez même nommer UserControl et utiliser une propriété personnalisée sur UserControl. Si vous faites cela, assurez-vous d'implémenter INotifyPropertyChanged et de déclencher l'événement PropertyChanged lors de la modification de cette propriété. – Sorskoot

0

Si vous connaissez les tailles auxquelles vous allez redimensionner, vous pouvez définir un nombre différent de ItemTemplate et les modifier.

+0

Doit être basé sur un curseur, donc je ne pense pas que je veux créer 500 ItemTemplates. –

+0

Cela ne fonctionnera pas, alors. Tant pis. –

Questions connexes