使用observablecollection的ListView双向绑定不会自动更新

时间:2011-10-13 22:54:07

标签: c# wpf listview data-binding

public ObservableCollection<App> Apps { get; set; }

public MainWindow()
{
    Apps = LoadApps();
    listview.ItemsSource = Apps;
}

public void AnotherMethod()
{
    Apps = LoadApps();
}

分配给ItemsSource时有效,但每次更改Apps内容时都需要更新ListView。

2 个答案:

答案 0 :(得分:1)

ObservableCollection仅在更新集合上的项目时更新ListView项目。 你可以做点什么

public void AnotherMethod()
{
    var apps = LoadApps();
    Apps.Clear();
    Apps.AddRange(apps);
}

或将Apps定义为依赖属性并将其绑定到列表视图ItemSource:

public static readonly DependencyProperty AppsProperty =
            DependencyProperty.Register("Apps", typeof (ObservableCollection<App>), typeof (YourClass), new PropertyMetadata(default(ObservableCollection<App>)));

public ObservableCollection<App> Apps
{
    get { return (ObservableCollection<App>) GetValue(AppsProperty); }
    set { SetValue(AppsProperty, value); }
}

public MainWindow()
{
    Apps = LoadApps();
    listview.SetBinding(ListView.ItemsSourceProperty, new Binding("Apps"){Source = this})
}

答案 1 :(得分:0)

“应用内容”是什么意思?如果您使用新集合替换整个参考,则需要MainWindow中的implement INotifyPropertyChanged。如果项目在内部发生变化,并且您希望在ListView中进行更新,则需要在App中实现所述界面。

(注意第一种可能性:通常你不会允许通过创建private readonly字段来替换引用,显然公开它的公共属性只会有一个getter。)