如何绑定到转换器返回的对象的属性

本文关键字:返回 转换器 对象 属性 何绑定 绑定 | 更新日期: 2023-09-27 18:22:44

我试图绑定到一个值,在它上运行转换器,然后显示该值的属性。让转换器直接返回我想要的属性是行不通的,因为我需要跟踪属性更改。

我想达到的目标是这样的:

// NOTE: FOLLOWING IS NOT SUPPORTED BY WPF
// A 'Binding' cannot be set on the 'Source' property of type 'Binding'.
// A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
Text={Binding TextField Source={Binding SomeValue, Converter={StaticResource GetObjectFromValueConverter}}}`

理想情况下,这一切都将被封装在一个简单的标记扩展中。

Text={l:GetTextField SomeValue}

问题是,除了将元素的Tag绑定到转换器,然后将目标字段绑定到属性之外,我一直找不到任何方法来做到这一点,如下所示:

Tag={Binding SomeValue, Converter={StaticResource GetObjectFromValueConverter}}
Text={Binding Tag.TextField, RelativeSource={RelativeSource Self}}

这显然是繁琐的、有限的(您只能得到一个Tag字段),而且感觉很滥用。在监控TextField的变化的同时,我还能如何实现我想要的目标?

如何绑定到转换器返回的对象的属性

您可以绑定TextBoxDataContext,而不是Tag。这将使您的其他绑定更加简单:

DataContext="{Binding SomeValue, Converter={StaticResource GetObjectFromValueConverter}}"
Text="{Binding TextField}"

这假设您在TextBox上没有任何其他需要继承DataContext的绑定。例如,在以下绑定中Text2将被破坏:

DataContext="{Binding SomeValue, Converter={StaticResource GetObjectFromValueConverter}}"
Text2="{Binding SomeOtherValue, Converter={StaticResource GetObjectFromValueConverter}}"
Text="{Binding TextField}"

此外,如果您有除TextBox之外的更复杂的控件,则逻辑/可视化树中其下方任何控件的DataContext也将受到影响。