MVVM: RaisePropertyChange для другого элемента в том же списке

1

Я использую MVVM Light в (довольно простом) проекте WPF.

У меня есть список версий, и для каждого из них есть кнопка "активировать" и "архивировать". Может быть активна только одна версия.
При нажатии "активировать" программное обеспечение должно архивировать текущую активную версию и активировать выбранную.
Как бы вы это сделали? В настоящее время я использую довольно уродливое решение: выбранная версия повторно запускает "активную версию" и архивирует ее, поэтому очевидно, что ранее активная версия не "обновилась".

Главное окно содержит список версий, отображаемых в ListBox (см. Этот вопрос).

public class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel()
    {
        this.InstalledVersions = InstalledVersionViewModel.GetInstalledVersions();
    }

    public ObservableCollection<InstalledVersionViewModel> InstalledVersions { get; set; }
}

Модуль InstalledVersionViewModel (упрощен) выглядит следующим образом:

public class InstalledVersionViewModel : ViewModelBase
{
    public InstalledVersionViewModel()
    {
        this.HandleActivateVersionCommand = new RelayCommand<RoutedEventArgs>(e => { this.ActivateVersion(); });
        this.HandleArchiveVersionCommand = new RelayCommand<RoutedEventArgs>(e => { this.ArchiveVersion(); });
    }

    public string FolderPath { get; set; }

    public RelayCommand<RoutedEventArgs> HandleActivateVersionCommand { get; private set; }

    public RelayCommand<RoutedEventArgs> HandleArchiveVersionCommand { get; private set; }

    public string VersionNumber { get; set; }

    public static InstalledVersionViewModel GetCurrentVersion()
    {
        return GetVersionInfos(baseInstallPath); // returns the currently-active version
    }

    public static ObservableCollection<InstalledVersionViewModel> GetInstalledVersions()
    {
        var list = new ObservableCollection<InstalledVersionViewModel>();
        // snip : fill the list from detected versions
        return list;
    }

    private void ActivateVersion()
    {
        // snip
        GetCurrentVersion().Archive();
        // snip
    }

    private void ArchiveVersion()
    {
        // snip
    }
}

Проблема заключается в методе ActivateVersion(): я получаю экземпляр новой версии для его архивации, поэтому, очевидно, экземпляр версии в списке никогда не знает об этом изменении. Но я не знаю, как изменить поведение для архивирования версии в списке. Я уверен, что должна быть какая-то система обмена сообщениями, обертка или всеобъемлющая структура, но я не могу ее перенести.

Благодаря !

Теги:
wpf
mvvm
mvvm-light

1 ответ

1
Лучший ответ

Для меня это должно быть обработано в MainViewModel. Например, добавьте свойство IsActive в ваш InstalledVersionViewModel и подпишитесь на событие PropertyChanged из вашего MainViewModel. Когда событие поднято, просмотрите список InstalledVersions чтобы найти ранее активный элемент, и вызовите метод Archive на нем.


Чтобы подписаться на мероприятие, просто просмотрите свой список после его создания:

public MainWindowViewModel()
{
    this.InstalledVersions = InstalledVersionViewModel.GetInstalledVersions();

    foreach (var version in this.InstalledVersions)
    {
        version.PropertyChanged += this.VersionPropertyChanged;
    }
}

Затем, в случае, проверьте, какое свойство было изменено:

private void VersionPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsActive")
    {
        var changedVersion = (Version)sender;

        // Checks that the version has been activated
        if (changedVersion.IsActive)
        {
            // Finds the previously active version and archive it
            foreach (var version in this.InstalledVersions)
            {
                if (version.IsActive && version != changedVersion)
                {
                    version.Archive();
                }
            }
        }
    }
}
  • 0
    Да, я начинал думать, что это будет общая архитектура (хотя я собирался проводить регулярные мероприятия, но это не очень MVVM-у), но как вы «подписываетесь на событие с измененным свойством», особенно на элементы в списке ? Спасибо !
  • 0
    @thomasbtv Смотрите мои изменения
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню