将新数据分配给 ItemsSource 后,数据将从列表视图中消失

本文关键字:数据 消失 列表 视图 新数据 分配 ItemsSource | 更新日期: 2023-09-27 18:17:49

我有以下ListView

<ListView 
    Grid.Row="1" 
    ItemsSource="{Binding MeditationDiary}" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Width="{Binding ElementName=ListViewHeaders, Path=ActualWidth}" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition  />
                    <ColumnDefinition  />
                </Grid.ColumnDefinitions>
                <TextBlock 
                    Grid.Column="0" 
                    Text="{Binding StartTime}" />
                <TextBlock 
                    Grid.Column="1" 
                    Text="{Binding TimeMeditated}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这绑定到类型 MeditationDiaryMeditationDiary 属性,该属性由 MeditationEntries 组成:

public class MeditationDiary : Collection<MeditationEntry> { }
public class MeditationEntry
{
    public DateTime StartTime { get; set; }
    public TimeSpan TimeMeditated { get; set; }
}

ListView绑定到此MeditationDiary

private MeditationDiary _meditationDiary;
public MeditationDiary MeditationDiary
{
    get
    {
        RaisePropertyChanged(nameof(MeditationDiary));
        return _meditationDiary;
    }
    set
    {
        _meditationDiary = value;
        RaisePropertyChanged(nameof(MeditationDiary));
    }
}

奇怪的是,当我将一个新的MeditationDiary对象分配给属性(其中包含带有MeditationEntries的数据(时,ListView不再显示数据。

我在添加条目后调用的 UpdateDiary 方法中分配新的MeditationDiary对象:

private async void UpdateDiary()
{
    var latestDiary = await _repository.GetAsync();
    MeditationDiary = latestDiary;
}

为什么会这样,如何解决?

将新数据分配给 ItemsSource 后,数据将从列表视图中消失

这很可能是搞砸绑定的罪魁祸首:

MeditationDiary = latestDiary;

相反,请尝试清除当前集合,然后向其添加新值:

MeditationDiary.Clear();
foreach (var entry in latestDiary)
    MeditationDiary.Add(entry);
添加新

项后,可能需要调用集合上的RaisePropertyChanged

作为旁注,您可以将MeditationDiary替换为 ObservableCollection<MeditationEntry> ,当您在其中添加/删除项目时,它会自动通知 UI。