2008-12-28 6 views
3

J'ai une application WPF qui implémente un ListView. Je voudrais montrer une image (une petite icône) dans l'une des colonnes en fonction du type de données que cette ligne représente. Un peu comme l'affichage que vous voyez dans l'Explorateur Windows. J'utilise DataTrigger ailleurs dans mon XAML, il semble qu'une méthode similaire pourrait être utilisée pour échanger du contenu de cellules entières, mais je ne trouve pas d'exemple de personne faisant cela.WPF: comment échanger le contenu de la cellule Listview avec un datatrigger (ou équivalent)

Des pensées?

Répondre

3

Il existe trois techniques courantes pour cela.

1) DataTrigger:

<DataTemplate x:Key="ImageColumn"> 
    <Grid> 
     <Image x:Name="img" Source="MyImage.png"/> 
     <Rectangle x:Name="rect" Fill="Red" Visibility="Hidden"/> 
    </Grid> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding TriggerProperty}" Value="2"> 
      <Setter TargetName="rect" Property="Visibility" Value="Visible"/> 
      <Setter TargetName="img" Property="Visibility" Value="Hidden"/> 
     </DataTrigger> 
     <!--etc...--> 
    </DataTemplate.Triggers> 
</DataTemplate> 

2) ValueConverters:

public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string strVal = value as string; 
     switch (strVal) 
     { 
      case "2": 
       Rectangle rect = new Rectangle(); 
       rect.Fill = Brushes.Red; 
       return rect; 

      default: 
       Image img = new Image(); 
       ImageSourceConverter s = new ImageSourceConverter(); 
       img.Source = (ImageSource)s.ConvertFromString("MyImage.png"); 
       return img; 
     } 
    } 
} 

3) MVVM (Model-View-ViewModel):

Créer un ViewModel classe qui enveloppe votre modèle de données. Ce ViewModel évalue les propriétés dans le modèle de données et les combine avec la logique dans une nouvelle propriété.

public UIElement Icon 
{ 
    get 
    { 
     if (TriggerProperty == "2") 
     { 
      Rectange rect = new Rectangle(); 
      rect.Fill = Brushes.Red; 
      return rect; 
     } 

     else 
     { 
      Image img = new Image(); 
      ImageSourceConverter s = new ImageSourceConverter(); 
      img.Source = (ImageSource)s.ConvertFromString("MyImage.png"); 
      return img; 
     } 
    } 
} 

Et le XAML:

<DataTemplate x:Key="ImageColumn"> 
    <ContentControl Content="{Binding Icon}"/> 
</DataTemplate> 
0

Dans le passé, j'ai utilisé ValueConverters pour fournir l'image que je veux afficher, mais je suis intrigué par la possibilité d'utiliser DataTriggers à cette fin.

Beatriz Stollnitz publie une solution à un numéro similaire here.

+0

Il y a une solution 4: TemplateSelectors – bitbonk

Questions connexes