2013-04-20 80 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線程調用的某些內容(而不要通過其他異步調用)。