Xamarin将List属性绑定到Listview DataTemplate中的元素

use*_*505 1 datatemplate xamarin xamarin.forms

我不能让数据绑定在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>
Run Code Online (Sandbox Code Playgroud)

Yur*_*biy 7

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

Property="{Binding Source={x:Reference Name = "YourListView"},
          Path=BindingContext.YourNameOfPropertyInViewModel}"
Run Code Online (Sandbox Code Playgroud)

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