UWP ListView有时仅显示数据

时间:2017-08-05 14:01:10

标签: c# uwp uwp-xaml

来自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(),它给出了相同的结果。

1 个答案:

答案 0 :(得分:1)

根据您提供的xaml.cs代码,问题如下所示:

首先,您不是在等待异步呼叫。

其次,您正在替换ObservableCollection。

解决方案:

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

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

  3. 您的代码中当前正在发生的事情是,在某些情况下,您在创建Binding对象之前替换ObservableCollection,有时在此之后,这就是为什么看起来您的app的行为完全是随机的 - 因为实际上它是。 :)通过添加我上面建议的修改,你将确保Binding对象绑定到你在构造函数中创建的ObservableCollection(在绑定时为空),然后你在MainPage已经是在初始化该集合之后已加载,因此您的ListView会收到有关更改的通知。

相关问题