Update/Refresh 没有从顶部开始的 ListView 或 ListView Item

Update/Refresh ListView or ListView Item without starting from the top

有没有办法 update/refresh 我的 ListView 或 ListView 项目?目前 update/refresh 我的 ListView 的唯一方法是:

public void NewsList_Selected(Object sender, SelectedItemChangedEventArgs e)
{
    var a = e.SelectedItem as NewsEntry;
    var b = from c in newsEntries
            where (a == c)
            select c;
    foreach(NewsEntry d in b)
    {
        d.Text = d.TextFull;
    }

    // Below is my update/refresh thing
    NewsList.ItemsSource = null;
    NewsList.ItemsSource = newsEntries;
 }

但这意味着如果我在我的 ListView 中向下滚动并 select 一个项目,我将再次跳到我的 ListView 的顶部。但我需要留在我离开的同一个地方。有解决办法吗?

正确的做法实际上是在您的模型 class 中使用 INotifyPropertyChanged 并将可观察集合用作您的 ListView ItemsSource。

  • 首先,用 INotifyPropertyChanged 继承你的 class 并实现它的 属性 像这样:

      public event PropertyChangedEventHandler PropertyChanged;  
    
      private void NotifyPropertyChanged(string propertyName)  
      {  
          if (PropertyChanged != null)  
          {  
             PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  
          }  
       }  
    
  • 然后为您的 ListView 创建一个 属性:

     private ObservableCollection<DataType> _FooCollection;
     public ObservableCollection<DataType> FooCollection { get{return _FooCollection; } set{_FooCollection = value; OnPropertyChanged(nameof(FooCollection )); }}
    
  • 在您的 Xaml 中将此集合指定为列表视图绑定:

     <ListView .... ItemsSource={Binding FooCollection} ..../>
    
  • 然后当您必须更改列表视图数据时,您所要做的就是分配 FooCollection,它会自动为您完成剩下的工作。

  • 例如:

    public void NewsList_Selected(Object sender, SelectedItemChangedEventArgs e)
    {
         var a = e.SelectedItem as NewsEntry;
         var b = from c in newsEntries
           where (a == c)
           select c;
         foreach(NewsEntry d in b)
        {
          d.Text = d.TextFull;
        }
    
         FooCollection = newsEntries; // This will do the rest for you 
    }