2017-02-03 31 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應該是轉換器的x:Key,在你的XAML的資源定義(如<UserControl.Resources>)和placeholderImage應該是如何獲得一個執行表示佔位符圖像(我的猜測出現在GetGuestImage())。

事實上,我想你可以簡單地用GetGuestImage來代替Convert方法的內容,但我無法確定。

+0

啊好吧謝謝!我使用entityframework和我的itemsource是listview.ItemsSource = db.Gaeste.ToList();我可以訪問轉換器中的對象嗎? –

+0

這更棘手,但可行。它可以依賴於你的MVVM框架;對於我來說,我會使用一個服務解析器,它會返回一個DbService,我可以隨心所欲地做任何事情。這項服務也將被注入適當的虛擬機。或者,如果對你來說更簡單,也可以簡單地做一個靜態類。甚至讓你的數據庫成爲虛擬機的一個屬性,並將其作爲'ConverterParameter =「{綁定數據庫}」' – Kilazur

+0

並將其傳遞。另外,請檢查其他答案,我的確忘記了需要將單元格模板考慮在內能夠顯示圖像。 – Kilazur

1

你可以用CellTemplate和值轉換器實現這一點:

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

無法雖然直接綁定到GetGuestImage()方法。另一個想法可能是通過數據對象類的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屬性來處理缺失值