假设我想展示一个对象列表,其中每个对象都应该有一个名称和一个合适的图片(例如带图标的菜单项或带文本和图像的按钮)。
所有的例子和程序都将图像在viewmodel中展示为PNG文件的路径,然后将Image
的Source
绑定到它。但是如果我想使用矢量图像(例如作为本地ResourceDictionary
中的DrawingImage
),怎么办呢?从viewmodel中公开DrawingImage似乎不好,因为我必须存储对应用程序/窗口/用户控件的引用(而且建议不要从视图模型中公开此类XAML对象)。
因此,更好的方法是在viewmodel中使用字符串标识符,然后选择适当的资源。如果该标识符是资源键,则以下代码片段看起来很有吸引力,但它无法工作:
<Image Source="{StaticResource {Binding Icon}}"/>
我找到了两种解决方法,尽管它们对我没有起作用。
第一种方法是使用一个转换器,在图标上进行普通的绑定,并在
Application.Current
中查找资源。我认为如果资源存储在其他地方,则此方法不起作用(最初遇到此问题的情况是由窗口选择启动应用程序!)。第二种解决办法 是使用从
StaticResourceExtension
派生出来的标记扩展来获取其通过绑定传递的ResourceKey
:
<Image Source="{local:BindableStaticResource {Binding Icon}"/>
这个看起来很不错,因为它可以使用本地资源,也可以用于其他事情。但是当我使用它时,总是会出现异常(“无法找到名为{FooIcon}的资源”,显示了正确的XAML文件和扩展的位置)。甚至仅从StaticResourceExtension
派生的空资源扩展,只是将资源键传递给基础构造函数也没有起作用,我无法解释原因。直接使用StaticResourceExtension
就可以正常工作。
有什么想法可以修复第二种方法,或者更好的解决方案吗?
编辑
我注意到直接像这样使用它是可以的:
<Window>
<Window.Resources>
<DrawingImage x:Key="SomeIcon"/>
</Window.Resources>
<Image Source="{BindableStaticResource {Binding Icon}}"/>
</Window>
但是在DataTemplate
中失败了。尽管正常的StaticResourceExtension
在这两种情况下都可以工作,所以我很困惑出了什么问题。