2016-10-17 1 views
1

Я не могу получить привязку данных для работы в DataTemplate в формах Xamarin. Я могу заставить его работать со списком (т. Е. Привязывать RowHeight), но однажды в DataTemplate установка свойств в свойство ViewModel не влияет.Формы Xamarin связывают свойства с элементами внутри элемента данных ListView DataTemplate

В приведенном ниже примере, если я устанавливаю свойство ColumnDefinition.Width в свойство, он полностью игнорируется, но его жесткое значение отлично работает. Я добавил ярлык, чтобы узнать, что такое значение свойства, и оно получается пустым, когда внутри Datatemplate, и я повторно проверил, что свойство верное, потому что, если я вынесу ярлык из списка, он отображает правильное значение ,

Любые идеи?

ОБНОВЛЕНИЕ: Мой класс «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> 
+0

Когда вы находитесь в DataTemplate для списка, вы привязываетесь к свойствам, которые относятся к содержимому списка, то есть в вашем случае вы привязываетесь к отдельному пациенту и его свойствам. Если у каждого пациента нет свойства под названием ParentPage, то, что вы пытаетесь сделать, не будет работать. – Jason

ответ

6

BindingContext, другими словами "ItemsSource" для ListView, является appliying ко всему ListView, включают в себя DataTemplate. Итак, если вы хотите что-то связать, то это свойство должно быть в BindingContext, в вашем случае это пациенты. Итак, класс Pasient должен включать это свойство. Но есть трюк. Где вы хотите связать что-то, что не в списке следует связывания контекста, то вы должны назвать свою ListView, как х: Name = «YourListView», а затем в вашем DataTemplate для связывания записи этого:

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

С этим, ваше свойство будет использовать контекст привязки уровня элемента списка, который является ViewModel в вашем случае.

+0

Спасибо, что меня на правильном пути, но я все еще смущен тем, как ссылаться на модель. – user197505

+0

В этом примере моя родительская страница имеет 2 свойства, ParentPage.Patients.Patients, которые являются источником элементов списка, и ParentPage.Settings.RowHeight, который содержит нужную высоту строк. Поэтому для доступа к высоте строки я пробовал такие вещи, как

+0

Я не могу понять, почему у вас есть два раза Пациенты, но что я могу сказать вам, что у вас есть два варианта: один - добавьте высоту свойства к вашим последним пациентам и привяжите ее, как вы всегда, просто напишите heightrequest = "{Binding Height}" или два - скажем, у вас есть viewmodel - ParentPageViewModel, тогда u должен делать, как я предложил, где путь: BindingContext.RowHeight. Много информации в Интернете, так что просто Google и читать, или предоставить более конкретные детали, например, viewmodel, view .. –

Смежные вопросы