如何在GridViewColumn中将值显示为图像?

Fro*_*840 4 .net c# wpf xaml

我有一个GridViewColumn,我绑定如下:

<GridViewColumn Header="Validated" DisplayMemberBinding="{Binding Path=Validated, Converter={StaticResource imageConverter}}" />
Run Code Online (Sandbox Code Playgroud)

Binding Path = Validated返回Enumerated值,imageConverter获取该值并返回System.Windows.Media.Imaging.BitmapImage.我已经检查了在创建其中一个BitmapImage对象时引用的对象的值,并且它似乎包含正确大小的图像.

我现在的问题是GridView中显示的是BitmapImage的URI(作为文本),而不是图像本身.

这次我做错了什么?

Wal*_*mer 16

更改imageConverter以返回图像的uri而不是实际图像.

<GridViewColumn Header="Validated">
  <GridViewColumn.CellTemplate>
    <DataTemplate>
        <Image Source="{Binding Path=Validated, Converter={StaticResource imageConverter}}" />
    </DataTemplate>
  </GridViewColumn.CellTemplate>
</GridViewColumn>
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意,不应在GridViewColumn中设置“ DisplayMemberBinding”,否则它将具有优先权,而“ CellTemplate”将被忽略。 (2认同)

Pav*_*van 6

摘自本网站:http: //social.msdn.microsoft.com/Forums/en-US/wpf/thread/96f18c2b-cade-42d9-b544-c64a7ce3d82b

首先,你应该有一个包含图像信息的类,至少是它的地址.

public class VideoGame
{
  public string Name
  {
    get;
    set;
  }

  public string Image
  {
    get;
    set;
  }
}
Run Code Online (Sandbox Code Playgroud)

其次,将一些实例添加到一个ObservableCollection中.

public partial class Window1 : Window
{
  private ObservableCollection<VideoGame> _games =
    new ObservableCollection<VideoGame>();

  public ObservableCollection<VideoGame> Games
  {
    get { return _games; }
  }

  public Window1()
  {
    _games.Add(new VideoGame() {
      Name = "Crysis",
      Image = @"C:\Crysis_Boxart_Final.jpg" });
    _games.Add(new VideoGame() {
      Name = "Unreal Tournament 3",
      Image = @"C:\Gearsofwar.JPG" });
    _games.Add(new VideoGame() {
      Name = "Gears of War",
      Image = @"C:\Crysis_Boxart_Final.jpg" });

    InitializeComponent();
  }
}
Run Code Online (Sandbox Code Playgroud)

第三,设置GridViewColumn.CellTemplate的DataTemplate.

<Window x:Class="VerticalAlignSnippet.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="Window1" Height="512" Width="512" Name="myWindow">
  <Grid>
    <ListView Name="myListView"
             ItemsSource="{Binding ElementName=myWindow, Path=Games}">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="Title" DisplayMemberBinding="{Binding Name}" />
          <GridViewColumn Header="Image">
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <Grid>
                  <Image Source="{Binding Image}" />
                </Grid>
              </DataTemplate>
            </GridViewColumn.CellTemplate>
          </GridViewColumn>
        </GridView>
      </ListView.View>
    </ListView>
  </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

这种方法在XAML中完成.您可以使用XamlReader在后面的代码中加载此DataTemplate.

  string str = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"><Grid><Image Source=\"{x:Null}\" /></Grid></DataTemplate>";


    DataTemplate template = new DataTemplate();

    template = XamlReader.Parse(str) as DataTemplate;
    .....
    gv1.Columns[3].CellTemplate = template;
Run Code Online (Sandbox Code Playgroud)