我在(非常简单的)WPF项目中使用MVVM Light。
我有一个版本列表,每个版本都有一个按钮"激活"和"存档"。只有一个版本可以激活 单击"激活"时,软件必须存档当前活动的版本,并激活所选的版本 你会如何模仿这个?我目前正在使用一个非常丑陋的解决方案:所选版本重新实例化了#34;活动版本"并将其归档,显然以前活跃的版本不会刷新"。
主窗口包含一个版本列表,显示在ListBox中(参见this question)。
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()方法:我正在获取一个新版本实例来存档它,所以显然列表中的版本实例永远不会意识到这种变化。但我不知道如何更改行为以存档列表中的版本。我非常确定应该有某种消息传递系统,包装器或总体结构,但我无法完全理解它。
谢谢!
答案 0 :(得分: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();
}
}
}
}
}