我现在已经解决了XAML数据绑定问题。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Pedagouge.Views;assembly=Pedagouge"
x:Class="Pedagouge.Views.StudentGroupView">
<StackLayout>
<ListView x:Name="Students">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<local:PhotoView x:Name="Photo" Persona="{Binding}" />
<StackLayout Orientation="Vertical" HorizontalOptions="StartAndExpand" VerticalOptions="StartAndExpand">
<Label Text="{Binding FullName}" />
<Label Text="{Binding StudentIsAt.Group.Name}" />
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
我认为我有约束力,但我清楚地表明我没有问题。
无论如何,问题是对于自定义控件PhotoView
,似乎{Binding}
用于属性Persona
的绑定上下文是PhotoView
&#39; s {{ 1}},而不是BindingContext
的上下文,因为它是DataTemplate
几行的结果。
如果这是WPF,我会把绑定改为
Label
这可能已经解决了,但这在这里不起作用(RelativeSource显然没有定义)。
为什么?如何将Persona="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListBoxItem}}"
绑定到Persona
的上下文,而不是像DataTemplate
s那样?
答案 0 :(得分:3)
Xamarin.Forms
(最多1.2.x)绑定始终使用BindableObject.BindingContext作为上下文绑定。
对于模板项,项目上下文设置为模板元素,在本例中为ViewCell
,递归到ViewCell.View
,StackLayout
,您的PhotoView
,内部StackLayout
和2 Label
。
FullName
和StudentIsAt.Group.Name
有效的事实是一个强烈暗示。
所以,当你说
时[...] for the custom control PhotoView it seems that the binding context used by
{Binding} to the property Persona is the PhotoView's BindingContext, not the
DataTemplate's context, [...]
它既是真的又是错的。
{Binding}
使用的绑定上下文是PhotoView的Bindingcontext,也是DataTemplate的上下文。
如果Binding无法按预期工作,可能是因为PhotoView
以某种方式将BindingContext
设置为this
,并阻止{Binding}
工作正如所料,但我不能在没有看到PhotoView
代码的情况下说出来。