c# - 从不同的类触发 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
更新。
这可能吗?怎么做?ServerSideChecked
Mod
解决方案
在Mods
setter 中,将 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));
}
}
推荐阅读
- c# - Asp.Net Core 3.1 数据被检索但未保存到数据库中
- android - react-native 如何使用链接打开本地文件 url?
- jquery - 如何从动态填充的表格中获取可点击单元格的数据
- amazon-web-services - 当消息被添加到 SQS 时,仅向 lambda 发送事件主体而不是整个事件
- ios - 我如何知道 NFC 护照芯片读取了哪个数据组?
- node.js - npm package.json 别名,例如 webpack
- python - 理解将月份名称映射到其数值的字典
- c# - 如何从自定义基础项目创建 ASP.NET Core MVC 样板
- django - django,在过滤器中遍历多个表(模型)
- react-native - 在 React Native Navigation 中的选项卡之间切换时如何保持堆叠的屏幕