首先是我开始的代码:
<ribbon:RibbonMenuButton IsEnabled="{Binding ForegroundIsConfigurable}"
SmallImageSource="{Binding Source={StaticResource imageSource},
Path=Source,
UpdateSourceTrigger=OnPropertyChanged}">
虽然此绑定正在编译并运行良好,但我不满意的原因是imageSource
运行时发生了变化。
StaticResource 标记扩展:通过查找对已定义资源的引用,为任何 XAML 属性特性提供值。该资源的查找行为类似于加载时查找,它将查找先前从当前 XAML 页面的标记以及其他应用程序源中加载的资源,并将该资源值生成为运行中的属性值- 时间对象。
由于imageSource
值在运行时发生变化,我不得不更改StaticResource
为DynamicResource
. 但该属性Source
不是依赖属性,因此以下代码将引发运行时错误:
SmallImageSource="{Binding Source={DynamicResource imageSource},
Path=Source,
UpdateSourceTrigger=LostFocus}
出于这个原因,我需要将动态资源直接绑定到SmallImageSource
,这是一个依赖属性:
SmallImageSource="{DynamicResource imageSource}"
这将再次引发运行时错误,因为imageSource
类型为Image
. SmallImageSource
期望值是ImageSource
.
现在有人可能会建议将数据上下文设置为我的动态资源并适当地绑定属性。如果我这样做,我会杀死IsEnabled
具有另一个DataContext
.
据我所知,MultiBinding
这也不是一个解决方案,因为这提供了一种将属性绑定到多个源的机制,但不提供针对不同上下文和源的绑定不同属性。
在考虑如何继续时,我想到幸运的是我可以将ImageSource
繁琐的内容移入IValueConverter
. 在我的给定数据上下文中,我RibbonMenuButton
有一个具有适当值的字符串值,这实际上也是我的ImageSource
.
无论如何,我仍然想知道如果我没有其他方法,我将如何解决问题,即如果两个来源都在不同的数据上下文中。有什么我没有看到的吗?如何通过覆盖DataContext
动态资源的属性的绑定来确保不杀死其他绑定?
这与DrawingImage msdn 页面imageSource
上的 XAML 示例非常相似。
<Image x:Key="imageSource">
<Image.Source>
<DrawingImage>
...