Xamarin将List属性绑定到Listview DataTemplate

时间:2016-10-17 14:08:41

标签: xamarin xamarin.forms datatemplate

我无法在Xamarin表单的DataTemplate中使用数据绑定。我可以使用Listview(即绑定RowHeight),但是在DataTemplate中,将东西设置为我的ViewModel的属性没有任何影响。

在下面的示例中,如果我将ColumnDefinition.Width设置为属性,则完全忽略它,但将其设置为硬值可正常工作。我已经放入一个标签来查看属性值是什么,并且在Datatemplate内部时它变成空白,我已经重新检查该属性是否正确,因为如果我从Listview中取出标签,它会显示正确的值。

有什么想法吗?

更新:我的班级是" ParentPage"它有2个属性:"患者"和"设置"。患者有一个可观察的" PatientList",我将如何绑定到" Settings.Fontsize"如下标签中所示。我已经尝试了我能想到的每一种组合:

<ListView   x:Name="listView" ItemsSource="{Binding ParentPage.Patients.PatientsList}" RowHeight="{Binding ParentPage.Settings.RowHeight}"  >
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <Grid HorizontalOptions="FillAndExpand">
          <Grid.RowDefinitions>
            <RowDefinition Height="*" />
          </Grid.RowDefinitions>
          <Image  Grid.Row="0" Grid.Column="0"
             Source="{Binding Picture}" />

          <Label  TextColor="Red" Text="{Binding ParentPage.Settings.FontSize}"   
       HorizontalOptions="Center" />

        </Grid>     
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

1 个答案:

答案 0 :(得分:7)

BindingContext,换句话说就是listview的“ItemsSource”,正在应用于整个列表视图,包括DataTemplate。所以,如果你想绑定一些东西,那么它的属性应该在BindingContext中,在你的情况下它是患者。所以,Pasient类应该包含这个属性。但是,有一个技巧。如果你想绑定一些东西,那不是在listview绑定上下文中,那么你应该命名你的listview,比如x:Name =“YourListView”,然后在你的datatemplate中为你的绑定写下这个:

Property="{Binding Source={x:Reference Name = "YourListView"},
          Path=BindingContext.YourNameOfPropertyInViewModel}"

这样,您的属性将使用listview元素级别的绑定上下文,即您的案例中的ViewModel。