【问题标题】:Data disappears from ListView after assigning new data to ItemsSource将新数据分配给 ItemsSource 后,数据从 ListView 中消失
【发布时间】:2015-10-14 22:15:58
【问题描述】:

我有以下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>

这绑定到 MeditationDiary 类型的 MeditationDiary 属性,该属性由 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;
}

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

【问题讨论】:

  • @GrantWinney 在添加条目后调用的UpdateDiary 方法中:private async void UpdateDiary() { var latestDiary = await _repository.GetAsync(); MeditationDiary = latestDiary; } latestDiary 是一个包含条目的对象。

标签: c# xaml listview windows-phone-8.1


【解决方案1】:

这很可能是破坏绑定的罪魁祸首:

MeditationDiary = latestDiary;

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

MeditationDiary.Clear();

foreach (var entry in latestDiary)
    MeditationDiary.Add(entry);

添加新项目后,您可能需要在集合上调用 RaisePropertyChanged

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

【讨论】:

  • 谢谢格兰特。这有帮助。我还必须从Grid Width="{Binding ElementName=ListViewHeaders, Path=ActualWidth}"&gt; 中删除绑定。当我保持它时,它会一直显示相同的行为(更新时清空显示)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多