更新数据源更改时的列表视图项

时间:2011-08-28 17:43:13

标签: c# wpf events xaml

我有一个用作日志的列表。我希望在我创建的列表视图中看到日志:

 <ListView Margin="12,114,12,12" Name="listView1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" />

日志中填充了我没有创建的类的字段,因此有一个类:

SomeClass
{

     public ReadOnlyCollection<Status> Log
     {
         get
         {
              return _log.AsReadOnly();
         }
     }

     // other method and fields
     // etc...

}

所以我能够看到列表项。此外,我能够使用此日志填充listview:

listView1.DataContext = server.Log;   // server is an instance of SomeClass

唯一的问题是,每次日志更改时,listview都不会更新。我必须调用listView1.DataContext = server.Log;每次我想刷新日志。

如何避免刷新列表视图?

1 个答案:

答案 0 :(得分:1)

您需要使用ObservableCollection<Status>代替ReadOnlyCollection<Status>

原因是Observable集合会在添加/删除项目时通知它绑定的控件。

如果您希望每个Status对象在其中一个属性发生更改时通知视图(因此Status实例中的属性发生更改,但集合上没有添加/删除),则Status必须实施INotifyPropertyChanged,并且每个Property都需要在其setter上引发PropertyChanged事件。

如果是第三方dll,您也可以通过composition完成所有这些操作。

旁注:为什么你的Margin超过100?您应该使用ContentPresenters,例如GridStackPanels