在DataTemplate中绑定自定义控件

时间:2014-10-04 14:47:22

标签: xamarin.forms

我现在已经解决了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那样?

1 个答案:

答案 0 :(得分:3)

Xamarin.Forms(最多1.2.x)绑定始终使用BindableObject.BindingContext作为上下文绑定。

对于模板项,项目上下文设置为模板元素,在本例中为ViewCell,递归到ViewCell.ViewStackLayout您的PhotoView ,内部StackLayout和2 Label

FullNameStudentIsAt.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代码的情况下说出来。