2017-08-05 50 views
0

我的数据来自ObservableCollection有时只显示在我的ListView。如果我重新启动应用程序,数据显示正常。有时,当我离开页面并返回时,数据有时会显示,而其他时间则不显示。这似乎是随机的。UWP ListView只显示数据有时

这里是我的XAML代码:

<ScrollViewer Grid.Row="2" Margin="0,42,0,0"> 
      <Grid> 
       <ListView ItemsSource="{x:Bind collection, Mode=OneWay}" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" IsItemClickEnabled="True" SelectionChanged="MySelectionChanged" Visibility="Visible"> 
        <ListView.ItemTemplate> 
         <DataTemplate x:DataType="local:ObjectName"> 
           <TextBlock Text="{x:Bind Data0, Mode=OneWay}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
       <ListView ItemsSource="{x:Bind collection, Mode=OneWay}" HorizontalAlignment="Left" Margin="375,0,0,0" VerticalAlignment="Top" SelectionMode="None" Visibility="Visible"> 
        <ListView.ItemTemplate> 
         <DataTemplate x:DataType="local:ObjectName"> 
          <TextBlock Text="{x:Bind Data1, Mode=OneWay}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Grid> 
     </ScrollViewer> 

我尝试了所有应该显示的数据做的Debug.WriteLine()和调试输出每一次成功打印它。在ListView上显示这些数据时只有一个问题。

编辑:这里是对应xaml.cs代码:

private ObservableCollection<ObjectName> collection; 
    private List<ObjectName> sorted; 
    private ObjectName clicked = new ObjectName(); 

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

    private async void GetSave() 
    { 
     DataStorage ds = new DataStorage(); 
     await ds.DeserializeObjectAsync(); 
     collection = ds.ObjectName; 
     if (collection != null) 
     { 
      sorted = new List<ObjectName>(collection); 
      sorted.Sort((x, y) => string.Compare(x.Data0, y.Data0)); 
      collection = new ObservableCollection<ObjectName>(sorted); 
     } 
    } 

我的逻辑之前和之后尝试的InitializeComponent(),并且它给相同的结果。

+0

请问您可以添加更多关于您的'收藏'的代码吗?它是如何看起来像?你如何/何时实例化/初始化它? –

+0

我已将所需代码编辑到OP中。 :) – Ryukori

回答

1

根据您所提供的xaml.cs代码,问题是这样的:

首先,你是不是在等待一个异步调用。

其次,您正在替换ObservableCollection。

解决办法:

  1. 不要从你的页面的构造函数中调用异步代码。异步调用是 称为异步出于某种原因,并试图通过 在调用它们时忽略await关键字来“隐藏”它们的真实性质将不起作用。将GetSave()的 返回值更改为Task,重写MainPage的OnNavigatedTo()方法(在其文档中更多地阅读 ),并等待GetSave() 。尽管如此,这并不能解决你的问题。

  2. 永远不要替换ObservableCollection。我记得因为这个,多次撞我的头在 墙上。您需要了解的是 ,当您绑定到XAML中的对象时,会创建一个专用的Binding 对象,它将源(您的情况,即 ObservableCollection)和目标(ListView)链接在一起。在 你的代码,最初'收集'被设置为空。创建MainPage 时,也会创建Binding对象,并将该值绑定到您的ListViews的Source属性。稍后,当您的 异步初始化代码完成后,您将该空值 替换为实际的ObservableCollection,但ListView并非 已通知有关此问题,他们只会在 集合的项目中查找它们绑定的更改,它们 处理情况下,集合本身交换 他们下不准备。所以你可以做什么来解决这个问题是:只在你的ObservableCollection实例在MainPage的构造函数中创建 (或在 声明 - 在这种情况下味道的问题),并在GetSave()第一个 调用collection.Clear(),然后添加与 collection.Add()。

什么目前发生在你的代码是,在某些情况下要更换的ObservableCollection之前创建绑定对象,有时在这之后,所以这就是为什么它看起来像你的应用程序的行为是完全随机的 - 因为它实际上是。 :)通过添加我上面建议的修改,您将确保Binding对象绑定到您在构造函数中创建的ObservableCollection(在绑定时为空),然后在MainPage已经初始化该集合之后加载,所以你的ListViews得到有关更改的通知。

+0

非常感谢你!完美工作。我很欣赏详细的解释! :) – Ryukori

+0

不客气!我很高兴能够提供帮助。 :) –