UWP Один ко многим обязателен - PullRequest
0 голосов
/ 25 февраля 2020

Я создаю приложение для навигации по месту, поэтому у меня есть два вида, один - список возможных мест назначения, а второй - изображение jpg с маркерами вверху, поэтому проблема:

на моей модели:

public class NavigationItem
{
   public string Name {get; set;}
   public string Icon{get; set;}
   public List<Vector2> Location {get; set;}
}

на моей модели просмотра:

{
  public List<NavigationItem> NavigationItems {get; set;}
}

теперь часть xaml

<ScrollViewer>
  <Grid>
    <Image Source="map.jpg/>
    <winui:ItemsRepeater ItemsSource="{Binding NavigationItems}">
      <DataTemplate>
       <!-- And that's where the question is.... 
            I can't just do Image Source Binding, because location is List<Vector2>-->
      </DataTemplate>
   </winui:ItemsRepeater>
</ScrollViewer>

Итак, я подумал сделать еще один повторитель элементов, вложенный в первый, но Я не имею ни малейшего понятия, как распространять источник изображения на него, вот так:

<winui:ItemsRepeater ItemsSource="{Binding NavigationItems}">
   <DataTemplate>
       <winui:ItemsRepeater DataContext="{Binding}" ItemsSource="{Binding Location}" >
           <DataTemplate x:DataType="models:NavigationItemModel">
               <Image Source="{Binding Icon}"/>
            </DataTemplate>
        </winui:ItemsRepeater>
    </DataTemplate>
</winui:ItemsRepeater>

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

1 Ответ

0 голосов
/ 26 февраля 2020

Если вы хотите связать источник изображения с помощью свойства Icon, вам нужно изменить DataContext изображения на DataContext второго ItemsRepeater. Таким образом, вы можете подписаться на событие ElementPrepared от ItemsRepeater, что означает, что это событие происходит каждый раз, когда элемент готов к использованию. Поэтому при запуске этого события вы можете изменить в нем DataContext of Image.

.xaml:

<winui:ItemsRepeater ItemsSource="{Binding NavigationItems}">
    <DataTemplate>
        <winui:ItemsRepeater ItemsSource="{Binding Location}" ElementPrepared="ItemsRepeater_ElementPrepared">
            <DataTemplate>
                <Image Source="{Binding Icon}"/>
            </DataTemplate>
        </winui:ItemsRepeater>
    </DataTemplate>
</winui:ItemsRepeater>

.cs:

private void ItemsRepeater_ElementPrepared(Microsoft.UI.Xaml.Controls.ItemsRepeater sender, Microsoft.UI.Xaml.Controls.ItemsRepeaterElementPreparedEventArgs args)
{
    var repeaterDataContext = sender.DataContext;
    Image MyImage = args.Element as Image;
    MyImage.DataContext = repeaterDataContext;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...