MVVM: RaisePropertyChange在同一列表中的另一个项目

本文关键字:另一个 项目 列表 RaisePropertyChange MVVM | 更新日期: 2023-09-27 18:08:26

我在一个(非常简单的)WPF项目中使用MVVM Light。

我有一个版本列表,每个版本都有一个按钮"激活"answers"存档"。只有一个版本可以激活。
当点击"激活"时,软件必须存档当前激活的版本,并激活所选版本。
你会如何建模呢?我目前正在使用一个相当丑陋的解决方案:选择的版本重新实例化"活动版本"并存档它,所以很明显以前的活动版本没有"刷新"。

主窗口包含一个版本列表,显示在列表框中(参见这个问题)。

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()方法:我得到一个新的版本实例来存档它,所以很明显,列表中的版本实例永远不会意识到这个变化。但我不知道如何改变行为存档的版本在列表中代替。我很确定应该有某种消息传递系统、包装器或总体结构,但我不能确切地指出是什么。

谢谢!

MVVM: RaisePropertyChange在同一列表中的另一个项目

对我来说,应该在MainViewModel中处理。例如,向InstalledVersionViewModel添加属性IsActive,并从MainViewModel订阅PropertyChanged事件。当事件被引发时,浏览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();
                }
            }
        }
    }
}