【问题标题】:Display Image in WPF Listview在 WPF 列表视图中显示图像
【发布时间】:2017-02-03 10:51:57
【问题描述】:

我想在我的列表视图中显示一张图片,但我不知道该怎么做。 我的 Guest 类有 GetGuestImage() 方法,它返回一个绝对路径。 当此文件存在时应加载,而当不存在时应加载占位符图像。

我怎么能意识到这一点?

<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>

【问题讨论】:

标签: c# wpf entity-framework listview listviewitem


【解决方案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>

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

    //+ the other properties...
}

【讨论】:

    【解决方案2】:

    为此使用转换器。

    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 资源中定义(如&lt;UserControl.Resources&gt;),而placeholderImage 应该是您如何检索所述占位符图像的实现(我猜它出现在@ 987654327@).

    事实上,我猜你可以简单地用你的GetGuestImage 替换Convert 方法的内容,但我不能确定。

    【讨论】:

    • 啊好的谢谢!!!我使用实体框架,我的 itemsource 是 listview.ItemsSource = db.Gaeste.ToList();我可以访问转换器中的对象吗?
    • 这比较棘手,但可行。它可以取决于您的 MVVM 框架;对我来说,我会使用一个服务解析器,它会返回一个 DbService,我可以用它做任何我想做的事情。该服务也将被注入到适当的虚拟机中。或者,如果对您来说更容易,也可以简单地做一个静态类。甚至让您的数据库成为 VM 的属性,并将其作为 ConverterParameter="{Binding Database}" 传递
    • 另外,查看其他答案,我确实忘记考虑需要单元格模板才能显示图像。
    • 检查我的答案。您可以将传递给 Convert 方法的 value 参数转换为“Gaeste”或您的任何类型:Gaeste dataObject = value as Gaeste;
    • @MathisHüttl 当您在后台设置 Listview.ItemsSource 时,它会为源中的每个项目从模板中创建一个新项目并将该项目“DataContext”设置为列表中的项目,因此“DataContext” ' 因为模板始终是列表中的对象
    【解决方案3】:

    首先您需要绑定到属性而不是方法其次 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 属性来处理缺失值

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2013-05-18
      • 1970-01-01
      • 2010-10-20
      • 2013-03-26
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多