Сетка данных Silverlight: динамически привязывается к источнику изображения на основе строки свойств объекта? - PullRequest
2 голосов
/ 22 июля 2011

У меня есть список объектов. Каждый объект имеет свойство с именем "ext", которое представляет тип файла. (PDF, CSV и т. Д.) Программно перед тем, как связать источник данных сетки данных с коллекцией объектов, я динамически создаю столбцы сетки данных, используя объекты datagridtemplatecolumn.

У меня есть ресурс DataTemplate, который в основном представляет собой изображение:

<DataTemplate x:Key="imageThumb">
        <Image x:Name="docImage" Width="25" Height="25" Source="/MyApp;component/images/pdf-icon.png">
            <Image.Effect>
                <DropShadowEffect ShadowDepth="1" BlurRadius="1" Opacity="0.5"/>
            </Image.Effect>
        </Image>
    </DataTemplate>

Затем в моем коде позади при динамическом создании столбцов шаблона сетки данных:

DataTemplate imageTemplate = (DataTemplate)this.Resources["imageThumb"];

DataGridTemplateColumn docType = new DataGridTemplateColumn();
docType.Header = "Doc Type";
docType.CellTemplate = imageTemplate;
targetDataGrid.Columns.Add(docType);

Когда я просто устанавливаю это как шаблон ячейки столбца таблицы данных, все хорошо, но, очевидно, в каждой строке есть значок PDF в столбце. Я хочу динамически изменить исходный путь этого образа "на основе свойства extension объекта, который связан со строкой сетки данных.

Есть ли способ сделать это?

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Получить код для StringToObjectConverter из этого блога Еще один блог о IValueConverter

В ваших ресурсах Xaml настройте свой набор известных изображений значков в StringToObjectConverter, например:

        <local:StringToObjectConverter x:Key="DocTypeToBitmap">
             <ResourceDictionary>
                 <BitmapImage x:Key="pdf" UriSource="/MyApp;component/images/pdf-icon.png" />
                 <!-- Other BitmapImages here -->
                 <BitmapImage x:Key="__default__" UriSource="/MyApp;component/images/unknown-icon.png" /> 
            </ResourceDictionary>
         </local:StringToObjectConverter>

(Конечно, вы можете заполнить этот список BitmapImages программно, если хотите).

Теперь вы можете использовать этот конвертер с привязкой в ​​вас

<DataTemplate x:Key="imageThumb">
    <Image x:Name="docImage" Width="25" Height="25" Source="{Binding docType, Converter={StaticResource DocTypeToBitmap}}"> 
        <Image.Effect>
            <DropShadowEffect ShadowDepth="1" BlurRadius="1" Opacity="0.5"/>            
        </Image.Effect>
    </Image>
</DataTemplate>

Теперь изображение будет отслеживаться с изменениями docType динамически.

1 голос
/ 22 июля 2011

Если вы привязываетесь к модели для других значений столбца, вы можете создать частичный класс для используемого вами класса модели. Напишите свойство, используя просто get, который возвращает изображение, которое вы хотите отобразить (я полагаю, на основе значения другого свойства этой модели, такого как docType). Затем вы можете связать столбец миниатюр, как и другие столбцы. Вам также понадобится ImageConverter.

Вы можете пропустить необходимость использования ImageConverter, если ваше свойство возвращает BitmapImage вместо Image. Вроде как это:

public BitmapSource ThumbnailBitmapSource {
    get {
        BitmapImage img = new BitmapImage(someUriYouGetBasedOnDocType);
        return img;
    }
}

Чтобы изображение автоматически обновлялось при изменении docType, вам также необходимо реализовать следующее в вашем частичном классе

partial void OnDocTypeChanged() {
    this.RaiseDataMemberChanged("ThumbnailBitmapSource");
}
...