c# - MVVM : RaisePropertyChange on another item in the same list

标签 c# wpf mvvm mvvm-light

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

我有一个版本列表,每个版本都有一个“激活”和“存档”按钮。只能激活一个版本。
单击“激活”时,软件必须存档当前 Activity 的版本,然后激活所选的版本。
您将如何对此建模?我当前使用的是一个非常丑陋的解决方案:所选版本重新实例化“ Activity 版本”并将其存档,因此显然以前的 Activity 版本不会“刷新”。

主窗口包含一个版本列表,显示在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()方法中:我正在获取一个新的版本实例进行存档,因此显然列表中的版本实例永远不会意识到这一更改。但是我不知道如何更改行为以将版本存档在列表中。我非常确定应该有某种消息传递系统,包装程序或总体结构,但是我不能完全依靠它。

谢谢 !

最佳答案

对我来说,应该在MainViewModel中处理。例如,将IsActive属性添加到InstalledVersionViewModel,然后从PropertyChanged订阅MainViewModel事件。引发事件时,浏览InstalledVersions列表以找到先前处于 Activity 状态的项目,然后在其上调用Archive方法。

要订阅 Activity ,只需在创建列表后浏览列表即可:

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();
                }
            }
        }
    }
}

关于c# - MVVM : RaisePropertyChange on another item in the same list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24208879/

相关文章:

wpf - 如何使用 MVVM 调用用户控制方法?

xaml - Windows 8.1 : Behaviors on Flyouts don't Work

c# - MVVM Light,将 RelayCommand<T> 与返回数据的方法一起使用

c# - EF4.1 代码优先 DbContext : The operation cannot be completed because the DbContext has been disposed

c# - 在 C# 中将列表对象转换为 json

c# - 从组合框中获取 .value 属性

c# - XAML - TextTrimming 不适用于 LineBreaks?

.net - 在没有服务定位器的情况下注入(inject) ViewModel

c# - 线程与 FIFO 顺序同步

c# - unity 3d碰撞时相机抖动