Я не говорю, что это единственное или лучшее решение, но у нас оно работает так:
Что вам нужно сделать, это:
Создайте метод WCF, который бы возвращал изображение по некоторому идентификатору или как-то еще. Должен возвращать байтовый массив (byte []):
public byte[] GetImage(int id)
{
// put your logic of retrieving image on the server side here
}
В вашем классе данных (объекты, отображаемые в сетке) создайте свойство Image, его получатель должен вызвать метод WCF и преобразовать байтовый массив в BitmapImage:
public BitmapImage Image
{
get
{
// here - connection is your wcf connection interface
// this.ImageId is id of the image. This parameter can be basically anything
byte[] imageData = connection.GetImage(this.ImageId);
// Load the bitmap from the received byte[] array
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageData, 0, imageData.Length, false, true))
{
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.StreamSource = stream;
try
{
bmp.EndInit();
bmp.Freeze(); // helps for performance
return bmp;
}
catch (Exception ex)
{
// Handle exceptions here
}
return null; // return nothing (or some default image) if request fails
}
}
}
В шаблоне вашей ячейки (или где-либо еще) поместите элемент управления Image и свяжите его свойство Source с созданным выше свойством Image:
<DataTemplate> <!-- Can be a ControlTemplate as well, depends on where and how you use it -->
<Image
Source={Binding Image, IsAsync=true}
/>
</DataTemplate>
Самый простой способ не останавливать пользовательский интерфейс при получении изображений - установить для свойства IsAsync значение false, как я. Но есть что улучшить. Например. Вы можете показать анимацию загрузки во время загрузки изображения.
Отображение чего-либо во время загрузки чего-либо может быть выполнено с помощью PriorityBinding (вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/ms753174.aspx).