2017-02-03 16 views
1

Ich möchte ein Bild in meiner Listenansicht anzeigen, aber ich weiß nicht, wie ich das machen soll. Meine Gastklasse hat die Methode GetGuestImage() sie gibt mir einen absoluten Pfad zurück. Wenn diese Datei vorhanden ist, sollte geladen werden und wenn kein Platzhalterbild geladen werden soll.Bild in WPF-Listenansicht anzeigen

Wie kann ich das erkennen?

<ListView x:Name="listview"> 
        <ListView.View> 
         <GridView> 
          <GridViewColumn DisplayMemberBinding="{Binding GetGuestImage()}" Header="Image" /> 
          <GridViewColumn DisplayMemberBinding="{Binding Vorname}" Header="Vorname" /> 
          <GridViewColumn DisplayMemberBinding="{Binding Nachname}" Header="Nachname" /> 
          <GridViewColumn DisplayMemberBinding="{Binding Postleitzahl}" Header="PLZ" /> 
          <GridViewColumn DisplayMemberBinding="{Binding Ort}" Header="Ort" /> 
          <GridViewColumn DisplayMemberBinding="{Binding Land}" Header="Land" /> 
         </GridView> 
        </ListView.View> 
       </ListView> 
+0

vielleicht hilft dies: http: // stackov erflow.com/questions/20530010/custom-listviewitem-in-listview –

Antwort

1

Verwenden Sie einen Konverter dafür.

public class NullGuestImageToPlaceholderConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null || !File.Exists(value as string)) 
      return placeholderImage; 

     return GetImage(value); 
    } 

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

XAML:

<ListView x:Name="listview"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding GuestImage, Converter={StaticResource nullGuestImageConverter}}" Header="Image" /> 
      <!-- your other columns --> 
     </GridView> 
    </ListView.View> 
</ListView> 

Ich habe nicht die GetGuestImage Implementierung oder Ihre volle XAML, so dass die meisten, das ich jetzt tun kann.

nullGuestImageConverter sollte die x:Key des Wandlers sein, definiert in XAML Ressourcen (wie <UserControl.Resources>) und placeholderImage sollte die Umsetzung, wie Sie das Abrufen von Platzhalter Bild (was ich denke, in GetGuestImage() erscheint).

In der Tat, ich denke, Sie könnten einfach den Inhalt der Convert Methode durch Ihre GetGuestImage ersetzen, aber ich kann es nicht sicher wissen.

+0

ah ok danke !!! Ich benutze das Entityframework und ich meine Itemsource ist listview.ItemsSource = db.Gaeste.ToList(); Kann ich auf das Objekt im Konverter zugreifen? –

+0

Das ist kniffliger, aber machbar. Es kann von Ihrem MVVM-Framework abhängen; für mich würde ich einen Service-Resolver verwenden, der einen DbService zurückgeben würde, mit dem ich machen könnte, was ich will. Dieser Dienst wird auch in die entsprechenden VMs eingefügt. Oder vielleicht einfach eine statische Klasse, wenn es für Sie einfacher ist. Oder haben Sie Ihre DB eine Eigenschaft der VM, und übergeben Sie es als 'ConverterParameter =" {Binding Database} "' – Kilazur

+0

Überprüfen Sie auch die anderen Antworten, habe ich tatsächlich vergessen, die Notwendigkeit für eine Zelle Vorlage zu berücksichtigen kann Bilder anzeigen. – Kilazur

1

Sie konnten erreichen dies mit einem Celltemplate und Werteumwandler:

<ListView x:Name="listview" xmlns:local="clr-namespace:WpfApplication1"> 
    <ListView.Resources> 
     <local:ImageConverter x:Key="ImageConverter" /> 
    </ListView.Resources> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Image"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <Image Source="{Binding Path=., Converter={StaticResource ImageConverter}}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn DisplayMemberBinding="{Binding Vorname}" Header="Vorname" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Nachname}" Header="Nachname" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Postleitzahl}" Header="PLZ" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Ort}" Header="Ort" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Land}" Header="Land" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

namespace WpfApplication1 
{ 
    public class ImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      dynamic dataObject = value; 
      if (dataObject != null) 
      { 
       string path = dataObject.GetGuestImage(); 
       if(System.IO.File.Exists(path)) 
        return new Uri(dataObject.GetGuestImage(), UriKind.RelativeOrAbsolute); 
      } 

      return new Uri(@"c:\yourplaceholderimage.png", UriKind.RelativeOrAbsolute); 
     } 

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

Sie allerdings nicht direkt an die GetGuestImage() -Methode binden kann. Eine andere Idee könnte darin bestehen, den Pfad durch eine Uri-Eigenschaft Ihrer Datenobjektklasse verfügbar zu machen und an diese zu binden. Dann brauchen Sie nicht einen Konverter:

<GridViewColumn Header="Image"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <Image Source="{Binding GuestImage}" /> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

public class YourDataClass 
{ 
    public Uri GuestImage 
    { 
     get { return new Uri(@"c:\picture.png", UriKind.RelativeOrAbsolute); } 
    } 

    //+ the other properties... 
} 
0

Zuerst Sie auf eine Eigenschaft binden, müssen keine Methode zweite die DisplayMemberBinding unterstützt nur grundlegende Bindung Sie Celltemplate wechseln müssen

<ListView x:Name="listview"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Image" > 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <Image Source="{Binding GuestImageProperty}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn DisplayMemberBinding="{Binding Vorname}" Header="Vorname" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Nachname}" Header="Nachname" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Postleitzahl}" Header="PLZ" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Ort}" Header="Ort" /> 
      <GridViewColumn DisplayMemberBinding="{Binding Land}" Header="Land" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

Dann können Sie die Eigenschaften TargetNullValue und FallbackValue der Bindung verwenden, um fehlende Werte zu behandeln