2016-03-02 41 views
0

我正在创建一个UWP应用程序,该应用程序应该从API获取一些数据并显示它,发生在“刷新)“ 方法。从MainPage.xaml.cs调用它的方法时,它运行但用户界面不更新

一切正常,直到我尝试搜索,即“搜索()”方法。

从MainPage调用“Search()”方法。

public sealed partial class MarvelMenu : Page, INotifyPropertyChanged 
{ 
    //Backing field. 
    private ObservableCollection<Character> _marvelCharacters = new ObservableCollection<Character>(); 

    //Property 
    public ObservableCollection<Character> MarvelCharacters 
    { 
     get { return _marvelCharacters; } 

     set 
     { 
      if (value != _marvelCharacters) 
      { 
       _marvelCharacters = value; 

       //Notify of the change. 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    //PropertyChanged event. 
    public event PropertyChangedEventHandler PropertyChanged; 

    //PropertyChanged event triggering method. 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private ObservableCollection<ComicBook> MarvelComics; 

    public MarvelMenu() 
    { 
     this.InitializeComponent(); 
     MarvelComics = new ObservableCollection<ComicBook>(); 
    } 

    private async void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///VoiceCommandDictionary.xml")); 
     await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(storageFile); 
     Refresh(); 
    } 

    public async void Refresh() 
    { 
     MyProgressRing.Visibility = Visibility.Visible; 
     MyProgressRing.IsActive = true; 
     ErrorTextBlock.Text = ""; 
     MarvelCharacters.Clear(); 

     while (MarvelCharacters.Count < 20) 
     { 
      Task t = MarvelFacade.PopulateMarvelCharactersAsync(MarvelCharacters); 
      await t; 
     } 

     try 
     { 
      this.MasterListBox.SelectedIndex = 0; 
     } 

     catch (Exception) 
     { 
      return; 
     } 

     MyProgressRing.IsActive = false; 
     MyProgressRing.Visibility = Visibility.Collapsed; 
     ErrorTextBlock.Text = MarvelFacade.errorMessage; 
     var attribute = await MarvelFacade.GetCharacterDataWrapperAsync(); 
     var myAttribute = attribute.attributionText; 

     try 
     { 
      AttributeTextBlock.Text = myAttribute; 
     } 

     catch (Exception) 
     { 
      return; 
     } 
    } 

    public async void Search(string searchedCharacter) 
    { 
     MyProgressRing.Visibility = Visibility.Visible; 
     MyProgressRing.IsActive = true; 
     ErrorTextBlock.Text = ""; 
     MarvelCharacters.Clear(); 
     Task t = MarvelFacade.PopulateMarvelCharactersByNameAsync(searchedCharacter, MarvelCharacters); 
     await t; 
     MyProgressRing.IsActive = false; 
     MyProgressRing.Visibility = Visibility.Collapsed; 
     ErrorTextBlock.Text = MarvelFacade.errorMessage; 
    } 

在调试模式下运行应用程序时,我发现C#代码运行完美,实际上从API中检索搜索到的数据,但未显示。 即使我看到Visual Studio经过该方法的每一步,实际上都没有显示它。

 <ListBox Name="MasterListBox" 
       ScrollViewer.VerticalScrollBarVisibility="Hidden" 
       ItemsSource="{x:Bind MarvelCharacters}" 
       Grid.RowSpan="3" 
       IsHitTestVisible="True" 
       SelectionChanged="MasterListBox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate x:DataType="data:Character"> 
        <ListBoxItem Style="{StaticResource ListBoxItemStyle}" 
           Margin="-12,-11,-12,-13" 
           IsHitTestVisible="False"> 
         <StackPanel Orientation="Horizontal"> 
          <Ellipse Width="40" 
            Height="40" 
            Margin="4"> 
           <Ellipse.Fill> 
            <ImageBrush ImageSource="{x:Bind thumbnail.small}"/> 
           </Ellipse.Fill> 
          </Ellipse> 
          <TextBlock Text="{x:Bind name}" 
             VerticalAlignment="Center" 
             Width="180" 
             TextTrimming="WordEllipsis" 
             FontSize="15" 
             Margin="10,0,0,0"/> 
         </StackPanel> 
        </ListBoxItem> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

我的列表框绑定到“MarvelCharacters”,它是一个公共的ObservableCollection属性。因此,当应用程序启动时它显示正常,但不会刷新以显示搜索结果。

任何人都可以帮助我我真的很感激。

+0

尝试刷新你的列表框,使用UpdateLayout – Roy

+0

你可以发布这种方法PopulateMarvelCharactersByNameAsync?我假设这种方法填充MarvelCharacters 另外,如果你从开始填充Marvelcharacters是否显示? –

+0

我第一次填充MarvelCharacters时,它可以正常工作,并且在任何其他时间填充属性,但是UI上没有任何反应。 –

回答

0

Xaml中的绑定具有一个称为“模式”的属性。该属性定义了绑定的方式。

一个有3种模式:一次性,单向,双向

一次性:使用将让ü乌尔数据绑定到乌尔UI只有一次,那就是在初始化时。之后,用户界面是独立的。 x:绑定默认模式设置为OneTime虽然经典绑定({绑定})默认设置为OneWay

单向:使用此选项可以确保每次更新数据时您的UI更新。

{x:Bind name,Mode=OneWay} 

{Binding name,Mode=OneWay} 

而经典绑定不需要显式声明,你可以简单地绑定,但对于编译绑定显式声明是必需的。

+0

是的,只是试过,并没有工作......另外,如果你看看我的“搜索()”方法,我不绑定ProgressRing的“可见性”属性,我手动设置它,但没有任何反应...... –

+0

虽然我得感谢你,因为它解决了我遇到的另一个问题,没有你的答案,我会浪费宝贵的时间在Google上寻找它... –

相关问题