2016-02-23 4 views
1

J'ai un GridView où je peux générer les Columns à l'exécution en fonction des paramètres de configuration. par exemple, Colonne de texte = pour afficher le texte Image Column = pour afficher le graphique.WPF GridView Colonne et modèle de cellule dynamique basé sur la valeur de données

mais le problème est que toute la colonne serait montrée soit de ce type. Ce que je veux faire est basé sur les données de cellule particulière, je veux (a) choisir un modèle dynamique (b) rendre le contenu dynamiquement (idéalement) comme FrameworkElement et définir le contenu de la cellule avec cela.

Cela signifie que chaque cellule peut afficher du texte ou une image. donc dans la première rangée, la première colonne pourrait être du texte et la deuxième rangée, la première colonne pourrait être des graphiques basés sur la valeur de données.

Existe-t-il un moyen de choisir le modèle en fonction de la valeur de contenu d'exécution de cellule particulière ou de rendre complètement un UIElement, puis de définir la valeur de la cellule?

Exemple: -

données Cell = <bold>Hello. I'm bold</bold> => affiche le texte en gras (TextBlock Element)

données Cell = <img>test.png</img> => affiche l'image (image Element)

Répondre

0

Vous pouvez obtenir ceci avec Triggers

Voici l'exemple de code. .

<ListView Margin="10" Name="lvUsers"> 
    <ListView.View> 
     <GridView x:Name="gridview"> 
      <GridViewColumn Header="Type"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ContentControl> 
          <ContentControl.Style> 
           <Style TargetType="{x:Type ContentControl}"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding IsImage}" Value="True"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value>               
                <DataTemplate> 
                 <TextBlock Text="Text goes here" 
                Foreground="Red"/> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 

             <DataTrigger Binding="{Binding IsImage}" Value="False"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <TextBlock Text="Image goes here"/> 
                 <!--<Image Source="{Binding source}" />--> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </ContentControl.Style> 
         </ContentControl> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 

     </GridView> 
    </ListView.View> 
</ListView> 

Et le code backend exemple

public partial class MainWindow : Window 
{  

    public MainWindow() 
    { 
     InitializeComponent(); 
     List<myClass> mc = new List<myClass>(); 
     mc.Add(new myClass() { Itemsource = "textblock text", IsImage = false }); 
     mc.Add(new myClass() { Itemsource = "Image source", IsImage = true }); 
     lvUsers.ItemsSource = mc; 
    }  
} 

class myClass 
{ 
    public string Itemsource { get; set; } 
    public bool IsImage { get; set; } 

} 
+0

Salut GopicHandar, Merci pour votre réponse, mais je n'avais pas une propriété séparée pour le type. Je n'ai qu'une seule propriété de type chaîne où les données réelles sont et j'ai besoin de rendre le contenu basé sur ce texte de chaîne. – Abdullah

+0

@Abdullah Existe-t-il un moyen de différencier les deux propriétés (image et texte)? Si possible, pls partager le code. – Gopichandar