绑定到绑定:数据绑定间接 - 或 - WPF 中的元绑定
Binding to a Binding: Data Binding indirection -or- Metabinding in WPF
除了举例无法解释这个问题:
假设您有一个自定义 UserControl
,其中包含两个 DependencyProperty
,StatList Stats
和 string ImportantStat
。用户控件的工作是显示 table,显示 Stats
中的所有值,但对 ImportantStat
.
进行特殊视觉处理(如饼图)
我的直觉是写一个 XAML 的块,看起来或多或少像:
<PieChart Value="{Binding Path={Binding ImportantStat} }"/>
其中 DataContext
预先设置为 Stats
。因此,用户传入 ImportantStat = "WinPercentage"
并且饼图绑定到统计行的 WinPercentage
属性。但是用户可以轻松地选择其他一些 属性 来强调。
问题(当然,你已经知道了,受过教育的 Stacker)是你收到一条错误消息,指出你无法从 Binding
转换为 string
,这就是外部 Binding
期望 Path
。虽然我还没有向自己证明这一点,但我猜这只是因为 Path
不是 DependencyProperty
.
那么,有什么方法可以实现我的目标吗?随意打破我在第一段中的假设。也许,例如,ImportantStat
不能是 string
但它本身必须是 Binding
.
编辑:尝试 #1 失败
我希望从代码隐藏中公开一个新的 DependencyProperty
Binding ImportantStatBinding
可以让我将 XAML 重写为:
<PieChart Value="{Binding ImportantStatBinding, RelativeSource=... }"/>
...但无济于事。间接 Binding
只是陷入 Value
本身,没有尝试解决它。
我的备份解决方案(可能就是这个方向)将只是在我可以直接访问 ImportantStat
的代码隐藏中创建内容,因此可以通过单个 Binding.
据我所知,如果没有额外的代码,就无法以这种方式连接数据绑定。更简单地说,我们可以有以下形式的数据绑定(当然):
A --> B --> C
但您不能具有以下形式的数据绑定:
A --> B --> *A(*A表示目标取决于A的值)
因为必须修复关系。
似乎可以创建一个 Converter
,其工作是通过使用一些额外的上下文和该字符串作为 属性路径。这听起来与类型问题有关,所以我选择了我能想到的唯一其他方式:
我在后面的代码中为 PieChart
添加了一个新的 DependencyProperty
并确保我在适当的时间构建它,以便 XAML 可以使用它。这很丑陋,但它有效。我只是觉得内心有点死气沉沉:)希望有一天有人会觉得这有用。
除了举例无法解释这个问题:
假设您有一个自定义 UserControl
,其中包含两个 DependencyProperty
,StatList Stats
和 string ImportantStat
。用户控件的工作是显示 table,显示 Stats
中的所有值,但对 ImportantStat
.
我的直觉是写一个 XAML 的块,看起来或多或少像:
<PieChart Value="{Binding Path={Binding ImportantStat} }"/>
其中 DataContext
预先设置为 Stats
。因此,用户传入 ImportantStat = "WinPercentage"
并且饼图绑定到统计行的 WinPercentage
属性。但是用户可以轻松地选择其他一些 属性 来强调。
问题(当然,你已经知道了,受过教育的 Stacker)是你收到一条错误消息,指出你无法从 Binding
转换为 string
,这就是外部 Binding
期望 Path
。虽然我还没有向自己证明这一点,但我猜这只是因为 Path
不是 DependencyProperty
.
那么,有什么方法可以实现我的目标吗?随意打破我在第一段中的假设。也许,例如,ImportantStat
不能是 string
但它本身必须是 Binding
.
编辑:尝试 #1 失败
我希望从代码隐藏中公开一个新的 DependencyProperty
Binding ImportantStatBinding
可以让我将 XAML 重写为:
<PieChart Value="{Binding ImportantStatBinding, RelativeSource=... }"/>
...但无济于事。间接 Binding
只是陷入 Value
本身,没有尝试解决它。
我的备份解决方案(可能就是这个方向)将只是在我可以直接访问 ImportantStat
的代码隐藏中创建内容,因此可以通过单个 Binding.
据我所知,如果没有额外的代码,就无法以这种方式连接数据绑定。更简单地说,我们可以有以下形式的数据绑定(当然):
A --> B --> C
但您不能具有以下形式的数据绑定:
A --> B --> *A(*A表示目标取决于A的值)
因为必须修复关系。
似乎可以创建一个 Converter
,其工作是通过使用一些额外的上下文和该字符串作为 属性路径。这听起来与类型问题有关,所以我选择了我能想到的唯一其他方式:
我在后面的代码中为 PieChart
添加了一个新的 DependencyProperty
并确保我在适当的时间构建它,以便 XAML 可以使用它。这很丑陋,但它有效。我只是觉得内心有点死气沉沉:)希望有一天有人会觉得这有用。