首页 > 解决方案 > 从不同的类触发 RaisePropertyChanged

问题描述

我有一个名为 Mod 的课程:

class Mod : INotifyPropertyChanged
{
    private bool serverSideChecked;
    private string name;

    public bool ServerSideChecked
    {
        get => serverSideChecked;
        set
        {
            serverSideChecked = value;
            RaisePropertyChanged("ServerSideChecked");
        }
    }

    public string Name
    {
        get => name;
        set
        {
            name = value;
            RaisePropertyChanged("Name");
        }
    }
}

和另一个名为 Profile 的类,其中包含一个 Mod 列表

class ServerProfileNew : INotifyPropertyChanged
{
    public int ServerModsChecked { get => Mods.Where(m => m.ServerSideChecked == true).Count(); }

    private List<Mod> _mods = new List<Mod>();
    public List<Mod> Mods
    {
        get => _mods;
        set
        {
            _mods = value;
            RaisePropertyChanged("Mods");
        }
    }
}

这两个类都实现了 INotifyPropertyChanged。每当更改为实时检查模块的总数时,我都需要ServerModsChecked进行Profile更新。 这可能吗?怎么做?ServerSideCheckedMod

标签: c#wpfmvvmdata-bindinginotifypropertychanged

解决方案


Modssetter 中,将 PropertyChanged 事件处理程序附加到_mods. 在该处理程序中,调用RaisePropertyChanged("ServerModsChecked");.

之前不要忘记将处理程序与当前_mods集合中的元素分离。

public List<Mod> Mods
{
    get => _mods;
    set
    {
        if (_mods != null)
        {
            _mods.ForEach(m => m.PropertyChanged -= ModCheckedChanged);
        }

        _mods = value;

        if (_mods != null)
        {
            _mods.ForEach(m => m.PropertyChanged += ModCheckedChanged);
        }

        RaisePropertyChanged("Mods");
    }
}

private void ModCheckedChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(Mod.ServerSideChecked))
    {
        RaisePropertyChanged(nameof(ServerModsChecked));
    }
}

推荐阅读