Возможно, сбой привязки WinRT FlipView

У меня есть xaml-страница:

<Page x:Class="DailyStyleW8.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:DailyStyleW8"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:converters="using:DataTypes"
      mc:Ignorable="d">

  <Page.Resources>
    <converters:PortableImageConverter x:Key="ImageConverter" />
  </Page.Resources>

  <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
      <ProgressBar x:Name="loadingViewer"
                   IsIndeterminate="True"
                   Height="20" />
      <FlipView x:Name="displayViewer"
                ItemsSource="{Binding}"
                Visibility="Collapsed">
        <FlipView.ItemTemplate>
          <DataTemplate>
            <Grid>
              <Image Source="{Binding Image,Converter={StaticResource ImageConverter}}" />
              <TextBlock Text="{Binding Name}" />
            </Grid>
          </DataTemplate>
        </FlipView.ItemTemplate>
      </FlipView>
    </Grid>
  </Grid>
</Page>

и в коде файла:

using DailyStyleApp;
using PortableAPI;
using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace DailyStyleW8
{
    /// <summary>
    /// Display a list of recent updates to the user
    /// </summary>
    public sealed partial class MainPage : Page
    {
        Controller controller = new Controller();

        public MainPage()
        {
            this.InitializeComponent();
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            LoadContent();
        }

        private async void LoadContent()
        {
            var viewModel = await controller.GetMultiDayAsync(DateTime.Now, PortableAPIProvider.Storage.ReadFromSettings<int>("CacheDuration", 7));
            displayViewer.ItemsSource = viewModel.Items;
            displayViewer.Visibility = Windows.UI.Xaml.Visibility.Visible;
            loadingViewer.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
        }
    }
}

Теперь, когда я запускаю код, функция LoadContent вызывается правильно, и объект viewModel формируется правильно. Если я закомментирую строку displayViewer.ItemsSource = viewModel.Items;, видимость ProgressBar изменится, как и следовало ожидать.

Когда эта строка остается и проходит через все 4 строки внутри метода LoadContent, запускаются, однако FlipView не обновляются новыми элементами, а видимость ProgressBar не изменяется. viewModel.Items относится к типу List<T>.

Я даже уверен, что здесь нужно искать. Я предполагаю, что что-то не так с XAML и моей привязкой?


person Ian Cant    schedule 20.04.2013    source источник
comment
GetMultiDayAsync когда-нибудь возвращается?   -  person Filip Skakun    schedule 20.04.2013
comment
Да и все это формируется из правильных данных. Я также попытался скопировать список, который он возвращает, в новый список в классе, но все равно без радости. displayViewer.ItemsSource = viewModel.Items; — это конкретный вызов, из-за которого все идет не так.   -  person Ian Cant    schedule 20.04.2013
comment
Я обнаружил кое-что еще: кажется, что строка, которую я определил как проблему, также вызывает блокировку потока пользовательского интерфейса? С закомментированным displayViewer.ItemsSource = viewModel.Items; это позволяет мне закрыть приложение с помощью Alt + F4, однако, если я раскомментирую эту строку, приложение не закроется по Alt + F4.   -  person Ian Cant    schedule 21.04.2013


Ответы (1)


Проблема, связанная с этим вопросом, на самом деле была связана с другим разделом кода в приложении. В другом месте у меня была серия вызовов async/await, которые блокировали поток пользовательского интерфейса.

Это помешало планировщику когда-либо запускать обратные вызовы для асинхронного. Вкратце решение проблемы: никогда не вызывайте await для чего-то, что вызывается из потока пользовательского интерфейса (а не через другой асинхронный вызов).

person Ian Cant    schedule 26.11.2013