在WPF中,如果我想在绑定中引用整个对象(不是特定属性),我可以编写以下任何内容:
{Binding Path=.}
{Binding .}
{Binding}
像这样:
<ItemsControl ItemsSource="{Binding Widgets}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:WidgetControl Widget="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是在WinRT中,我无法让它工作:
<GridView ItemsSource="{Binding Source={StaticResource Widgets}}">
<GridView.ItemTemplate>
<DataTemplate>
<controls:WidgetControl Widget="{Binding}"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
它失败了一个非常模糊的例外:
The text associated with this error code could not be found.
Failed to assign to property 'XX.WidgetControl.Widget'. [Line: XX Position: XX]
ItemsSource绑定有效,因为每个DataContext
的{{1}}设置为controls:WidgetControl
。我知道明显的答案就是等待设置Widget
并将其转换为我的widget控件中的DataContext
。但我原则上问:为什么在WinRT中没有自我约束力的工作......或者有没有让它工作的符号?
答案 0 :(得分:0)
事实证明{Binding}
效果很好。我在DataContext
中错误地设置了WidgetControl
,导致绑定失败并让我相信WinRT绑定机制有问题。
要明确的是,{Binding .}
仍然没有像我在WPF中所做的那样工作。它将点解释为文字属性名称,而不是对self的引用:
Error: BindingExpression path error: '.' property not found on 'Widget'. BindingExpression: Path='.' DataItem='Widget'
但我的实际问题是尝试在我的WidgetControl的根级别更改DataContext,导致任何外部绑定失败。因为我将我的控件定义为<UserControl x:Name='controlRoot' DataContext="{Binding ElementName=controlRoot}
,<controls:WidgetControl Widget="{Binding}"/>
中的绑定引用了WidgetControl
本身,而不是我试图传入的Widget
。&#34;没有分配到财产&#34;异常是由属性更改的处理程序引发的,该处理程序期望Widget
,而不是WidgetControl
。
因此,您绝对可以使用{Binding}
来引用绑定所在事物的DataContext,而不是尝试将路径设置为&#34; .
&#34;