Предположим, что я хочу показать список объектов, в которых каждый объект должен иметь имя и подходящее изображение (например, MenuItems с иконками или кнопками с текстом и изображением).
Все примеры и программы отображали изображение в модели viewmodel как путь к файлу PNG, а затем привязывали к нему Source
Image
. Но что, если я хочу использовать векторные изображения (например, как DrawingImage
в локальном ResourceDictionary
)? Выявление DrawingImage из модели представления кажется плохим, потому что мне нужно будет хранить ссылку на приложение/окно/пользовательский элемент управления /... (и рекомендуется не выставлять такие объекты XAML из моделей представлений).
Таким образом, лучшим подходом было бы использовать строковый идентификатор в модели представления, а затем каким-то образом выбрать соответствующий ресурс. Если этот идентификатор является ключом ресурса, этот фрагмент выглядит заманчивым, но не работает:
<Image Source="{StaticResource {Binding Icon}}"/>
Я нашел два обходных решения для этого, хотя они не работали для меня.
-
Первый использовал обычную привязку к значку с конвертером, который искал ресурс в
Application.Current
. Это не работает, если ресурс хранится где-то еще, я думаю (и ситуация, когда я изначально столкнулся с этой проблемой, еще не запускал приложение, так как это было Окно, выбирающее приложение для запуска!). -
Во втором обходном пути использовалось расширение разметки, полученное из
StaticResourceExtension
, которое извлекло егоResourceKey
из переданного привязки:<Image Source="{local:BindableStaticResource {Binding Icon}"/>
Этот выглядит очень аккуратно, потому что он может использовать локальные ресурсы, а также использоваться для других вещей. Но при использовании я всегда получал исключение ( "Resource с именем {FooIcon} не удалось найти.", Показывая правильный файл XAML и позицию расширения). Даже пустое расширение ресурса, полученное из
StaticResourceExtension
, которое просто передало ключ ресурса базовому конструктору, не работало, и я не могу объяснить, почему. Просто использованиеStaticResourceExtension
отлично справилось.
Любые идеи, как я мог бы исправить второй подход или даже лучшие решения?
Изменить
Я заметил, что он работает, когда используется прямо так:
<Window>
<Window.Resources>
<DrawingImage x:Key="SomeIcon"/>
</Window.Resources>
<Image Source="{BindableStaticResource {Binding Icon}}"/>
</Window>
но неудачно, например, в DataTemplate
. Хотя обычный StaticResourceExtension
работает в обоих случаях, поэтому я озадачен тем, что происходит не так.