当直接使用转换器绑定到DataContext时,如何更新WPF绑定?

8
通常,当您想要数据绑定控件“更新”时,使用“PropertyChanged”事件向界面发出信号,表明数据在幕后已更改。
例如,您可以有一个文本块,它绑定到具有属性“DisplayText”的数据上下文中。
<TextBlock Text="{Binding Path=DisplayText}"/>
从这里开始,如果DataContext使用PropertyName“DisplayText”引发PropertyChanged事件,则此文本块的文本应该更新(假设您没有更改绑定的模式)。
然而,我有一个更复杂的绑定,它使用许多数据上下文的属性来确定控件的最终外观和感觉。为了实现这一点,我直接绑定到数据上下文并使用转换器。在这种情况下,我正在使用图像源。
<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>
正如您所看到的,我使用{Binding}而不是路径直接绑定到数据上下文,并使用ImageConverter选择我要查找的图像。但现在我没有办法(我知道的)告诉该绑定更新。我尝试使用“.”作为属性名称引发propertychanged事件,但未能成功。
这可行吗?我必须将转换逻辑包装到绑定可以附加到的属性中,还是有一种方法可以告诉绑定刷新(而无需显式刷新绑定)?
任何帮助都将不胜感激。谢谢! -Adam
3个回答

21
这里的解决方法是向对象添加一个属性(用作数据上下文)称为“Self”,它只需返回: public Object Self { get { return this; }} 然后在绑定中使用此属性: <Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/> 然后,当调用 PropertyChanged(this, new PropertyChangedEventArgs("Self")) 就像魔法一样工作。
谢谢大家。

谢谢!我一直在疯狂地寻找这个问题的答案,正准备询问别人,结果它出现在了我的建议列表中。 - HDD
@Adam,多么优雅的黑客技巧啊!赞! - Alex

2
我不认为您现有的转换器可以完全实现您需要的功能。正如您所提到的,您可以在ViewModel中进行计算,或者将您的转换器更改为IMulitValueConverter。
从您的具体情况来看(将转换器绑定到ViewModel类和其中一些属性),我倾向于在ViewModel中实现逻辑。

0

嗯,你没有展示完整的实现。但我认为如果绑定到GUI的值提供了PropertyChanged事件,它应该会更新。

祝好


问题在于图像源直接绑定到数据上下文,而不是数据上下文的属性。转换器接收数据上下文并返回图像源。为了澄清,如果我使用一个具有路径到数据上下文属性的绑定,并调用该属性的PropertyChanged,则更新会发生(有效)。但是,我需要对象本身来确定图像(不仅仅是属性)。谢谢。 - Adam
在打字的时候我有一个想法。我要尝试在我的对象上放置一个名为“Self”的属性,它只返回自身,然后调用PropertyChanged("Self")。我会试一试这个方法。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接