Как отобразить значения в виде изображений в GridViewColumn? - PullRequest
3 голосов
/ 29 сентября 2010

У меня есть GridViewColumn, который я связал так:

<GridViewColumn Header="Validated" DisplayMemberBinding="{Binding Path=Validated, Converter={StaticResource imageConverter}}" />

Binding Path = Validated возвращает значение Enumerated, imageConverter принимает это значение и возвращает System.Windows.Media.Imaging.BitmapImage,Я проверил значение объекта, на который ссылается, когда создается один из этих объектов BitmapImage, и кажется, что он содержит изображение правильного размера.

Теперь моя проблема заключается в том, что в GridView отображаетсяURI BitmapImage (как текст), а не само изображение.

Что я делаю не так это время?

Ответы [ 2 ]

14 голосов
/ 30 сентября 2010

Измените imageConverter, чтобы он возвращал URI изображения вместо реального изображения.

<GridViewColumn Header="Validated">
  <GridViewColumn.CellTemplate>
    <DataTemplate>
        <Image Source="{Binding Path=Validated, Converter={StaticResource imageConverter}}" />
    </DataTemplate>
  </GridViewColumn.CellTemplate>
</GridViewColumn>
6 голосов
/ 29 сентября 2010

Взято с этого веб-сайта: 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;
  }
}

Во-вторых, добавьте несколько экземпляров в одну коллекцию 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();
  }
}

В-третьих, установите DataTemplate GridViewColumn.CellTemplate.

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

Этот подход выполняется в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...