2013-04-20 79 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;这一行,则ProgressBar的可见性会根据您的预期发生变化。

当该行留在并通过LoadContent方法中的所有4条线踩在运行,但FlipView不会更新与新的项目和ProgressBar知名度不改变。 viewModel.ItemsList<T>的类型。

我甚至确定在这里真正要搜索什么。我猜测XAML和我的绑定有问题吗?

+0

GetMultiDayAsync是否会返回? – 2013-04-20 15:33:06

+0

是的,它全部由正确的数据组成。我也尝试将它返回的列表复制到班级中的新列表中,但仍然没有快乐。 'displayViewer.ItemsSource = viewModel.Items;'是特定的调用,似乎使一切都出错了。 – 2013-04-20 16:09:43

+0

我发现了别的东西,似乎我认为是问题的线也会导致UI线程锁定? 使用'displayViewer.ItemsSource = viewModel.Items'注释掉它允许我用Alt + F4关闭应用程序,但是如果我取消注释该行,应用程序在Alt + F4上不会关闭。 – 2013-04-21 12:12:28

回答

0

与此问题相关的问题实际上是与应用程序中的另一部分代码有关。在其他地方,我有一系列异步/等待调用锁定了UI线程。

这可以防止调度器触发异步回调。总之,解决问题的方法是:永远不要呼吁等待从UI线程调用的某些内容(而不要通过其他异步调用)。