来自ObservableCollection的我的数据有时只显示在我的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 :(得分:1)
根据您提供的xaml.cs代码,问题如下所示:
首先,您不是在等待异步呼叫。
其次,您正在替换ObservableCollection。
解决方案:
不要从页面的构造函数中调用异步代码。异步调用是 因为一个原因而被称为异步并试图通过“隐藏”它们的真实性质 在调用它们时省略await关键字将不起作用。改变GetSave()的 将值返回给Task,重写OnNavigatedTo()方法(阅读更多 关于MainPage的文档)并等待GetSave() 在里面。但这并不能解决你的问题。
永远不要替换ObservableCollection。我记得我的头撞到了 因为这个原因多次挂墙。你需要了解的是 当你绑定到XAML中的对象时,一个专用的绑定 创建链接源的对象(在您的情况下,为 ObservableCollection)和目标(ListView)在一起。在 你的代码,最初'collection'设置为null。当你的MainPage 在创建时,也会创建Binding对象并将其绑定 ListViews的Source属性为null值。以后,当你的 异步初始化代码完成后,您替换该空值 使用实际的ObservableCollection,但ListViews不是 通知了这一点,他们只是在寻找变化 他们所绑定的集合项目,他们没有准备好 处理集合本身交换时的情况 在他们之下。那么你可以做些什么来解决这个问题:只创建 您在MainPage的构造函数中的ObservableCollection实例(或在 声明 - 在这种情况下的品味问题)和首先在GetSave() 调用collection.Clear()然后添加你的项目 collection.Add()。
您的代码中当前正在发生的事情是,在某些情况下,您在创建Binding对象之前替换ObservableCollection,有时在此之后,这就是为什么看起来您的app的行为完全是随机的 - 因为实际上它是。 :)通过添加我上面建议的修改,你将确保Binding对象绑定到你在构造函数中创建的ObservableCollection(在绑定时为空),然后你在MainPage已经是在初始化该集合之后已加载,因此您的ListView会收到有关更改的通知。