2017-02-03 13 views
1

私はリストビューに画像を表示したいが、どうすればいいのか分からない。 ゲストクラスはメソッドGetGuestImage()を持っています。絶対パスを返します。 このファイルが存在するときはロードする必要があり、そうでないときはプレースホルダイメージをロードする必要があります。WPFリストビューで画像を表示

どうすれば実現できますか?

<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

おそらくこれが役立ちます。http:// stackov erflow.com/questions/20530010/custom-listviewitem-in-listview –

答えて

1

これにはコンバータを使用します。

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> 

私はGetGuestImageの実装や、あなたの完全なXAMLを持っていないので、それは私が今のために何ができる最もです。

nullGuestImageConverterは、あなたのXAMLのリソース(<UserControl.Resources>のような)で定義されたコンバータのx:Key、あるべき、とplaceholderImageはあなたが(私はGetGuestImage()に表示されます推測)とプレースホルダの画像を取得する方法を実装する必要があります。

実際、の方法でConvertメソッドの内容を置き換えることはできますが、わかりません。

+0

ああありがとう!!!私はentityframeworkを使用し、私のitemsourceはlistview.ItemsSource = db.Gaeste.ToList()です。私はコンバータのオブジェクトにアクセスできますか? –

+0

これは扱いにくいですが、実行可能です。 MVVMフレームワークに依存する可能性があります。私にとっては、DbServiceを返すサービスリゾルバを使用したいと思っていました。このサービスは、適切なVMにも注入されます。あるいは、静的なクラスを簡単に行うこともできます。あるいは、あなたのDBをVMのプロパティにして、 'ConverterParameter =" {Binding Database} "として渡してください。 – Kilazur

+0

また、他の答えをチェックしてください。本当に、セルテンプレートの必要性を考慮に入れていません画像を表示することができる。 – Kilazur

1

あなたはCellTemplateと値コンバータでこれを達成することができます:あなたはしかしGetGuestImage()メソッドに直接結合することはできません

<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(); 
     } 
    } 
} 

。別の考え方は、データオブジェクトクラスのUriプロパティにパスを公開し、このオブジェクトにバインドすることです。

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

​​
0

まずあなたはプロパティではありませんメソッドにバインドする必要が二DisplayMemberBindingだけあなたがCellTemplate

<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> 
に切り替える必要がありバインディングの基本的なサポートしています。そして、あなたは、コンバータが必要ありません。

次に、バインディングのTargetNullValueプロパティとFallbackValueプロパティを使用して、欠損値を処理することができます。