2013-04-20 2 views
0

У меня есть страница XAML:WinRT FlipView связывания не удается, возможно,

<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;, видимость меняется, как и следовало ожидать.

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

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

+0

Возвращает ли GetMultiDayAsync? –

+0

Да и все это сформировано из правильных данных. Я также попытался скопировать список, который он возвращает в новый список в классе, но до сих пор не радует. 'displayViewer.ItemsSource = viewModel.Items;' это конкретный вызов, который, кажется, заставляет все пойти не так. –

+0

Я обнаружил что-то еще, кажется, что строка, которую я назвал проблемой, также вызывает блокировку потока пользовательского интерфейса? С 'displayViewer.ItemsSource = viewModel.Items;' закомментировал, что позволяет закрыть приложение с помощью Alt + F4, однако, если я раскомментирую эту строку, приложение не закрывается на Alt + F4. –

ответ

0

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

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

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