Двусторонняя привязка ListView с observablecollection не обновляется автоматически - PullRequest
0 голосов
/ 14 октября 2011
public ObservableCollection<App> Apps { get; set; }

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

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

Он работает, когда назначен ItemsSource, но мне нужно, чтобы ListView обновлялся каждый раз, когда изменяется содержимое приложений.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

ObservableCollection обновляет элементы ListView только при обновлении элементов коллекции. Вы можете сделать что-то вроде

public void AnotherMethod()
{
    var apps = LoadApps();
    Apps.Clear();
    Apps.AddRange(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})
}
0 голосов
/ 14 октября 2011

Что вы подразумеваете под "содержанием приложений"?Если вы замените всю ссылку новой коллекцией, вам нужно внедрить INotifyPropertyChanged в MainWindow.Если элементы меняются внутри и вам нужны обновления в ListView, вам необходимо реализовать указанный интерфейс в App.

(Примечание о первой возможности: часто вы не разрешаете заменуссылка путем создания поля private readonly, очевидно, что открытое свойство, предоставляющее его, будет иметь только геттер.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...