Я использую 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(): я получаю экземпляр новой версии для его архивации, поэтому, очевидно, экземпляр версии в списке никогда не знает об этом изменении. Но я не знаю, как изменить поведение для архивирования версии в списке. Я уверен, что должна быть какая-то система обмена сообщениями, обертка или всеобъемлющая структура, но я не могу ее перенести.
Благодаря !
Для меня это должно быть обработано в 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();
}
}
}
}
}