从 SortedList 中 T.MyProperty 上的所有 Property Changed 事件中获取 IObservable

2024-02-26

我有一个班级,MyClass实现INotifyPropertyChanged并且有一些实现的属性PropertyChanged. When MyClass.MyProperty变化,PropertyChanged如预期那样起火。另一个类包含一个SortedList<MyClass>.我尝试将事件合并到包含以下内容的类中的单个可观察对象中SortedSet<MyClass>并订阅它,但它似乎没有任何事件。这就是我正在尝试的:

Observable.Merge(MySortedList.ToObservable())
   .Subscribe(evt => Console.WriteLine("{0} changed", evt.MyProperty));

我想要得到的是一个单一的可观察对象,其中包含我的每个项目的所有事件SortedList<MyClass>。我尝试使用 ObservableCollection 来代替,但这不会改变任何东西,实际上也不会改变任何东西,因为无论如何,当所包含项目的属性发生变化时它不会触发 collectionchanged 。我可以聆听其中的各个元素SortedList<MyClass>并看到 PropertyChanged 事件触发,但我想要的是一个单一的 Observable,其中包含来自所有元素的所有 PropertyChanged 事件的流SortedList<MyClass>.

看起来这应该是使用 Rx 相当容易做到的事情,但我似乎不知道如何做。


我为 RxCookBook 撰写了一篇关于此主题的文章,您可以在这里找到https://github.com/LeeCampbell/RxCookbook/blob/master/Model/CollectionChange.md https://github.com/LeeCampbell/RxCookbook/blob/master/Model/CollectionChange.md有关 PropertyChange 通知的更多文章请参见此处https://github.com/LeeCampbell/RxCookbook/blob/master/Model/PropertyChange.md https://github.com/LeeCampbell/RxCookbook/blob/master/Model/PropertyChange.md

它通过聚合来自某个项目的更改来解决您需要的问题ObservableCollection<T>。通过使用ObservableCollection<T>当在集合中添加或删除项目时,您还会收到通知。

如果您不想使用ObservableCollection<T>(即您只想跟踪集合的给定快照的属性)那么您将需要执行其他操作。首先我假设你有一个INoftifyPropertyChanged to IObservable<T>扩展方法或者您只需使用标准事件IObservable<T>方法。

接下来,您可以将值列表投影到更改序列列表中,即IEnumerable<T> to IEumerable<IObserable<T>>。这允许您使用Observable.Merge将更改列表扁平化为单个stream的变化。

如果您不想使用上面的链接,这里有一个示例:

void Main()
{
    var myList = new List<MyThing>{
        new MyThing{Name="Lee", Age=31},
        new MyThing{Name="Dave", Age=37},
        new MyThing{Name="Erik", Age=44},
        new MyThing{Name="Bart", Age=24},
        new MyThing{Name="James", Age=32},
    };

    var subscription = Observable.Merge(myList.Select(t=>t.OnAnyPropertyChanges()))
                .Subscribe(x=>Console.WriteLine("{0} is {1}", x.Name, x.Age));

    myList[0].Age = 33;
    myList[3].Name = "Bob";

    subscription.Dispose();
}

// Define other methods and classes here
public class MyThing : INotifyPropertyChanged
{
private string _name;
private int _age;

public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        OnPropertyChanged("Name");
    }
}

public int Age
{
    get { return _age; }
    set
    {
        _age = value;
        OnPropertyChanged("Age");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}

public static class NotificationExtensions
{
    /// <summary>
    /// Returns an observable sequence of the source any time the <c>PropertyChanged</c> event is raised.
    /// </summary>
    /// <typeparam name="T">The type of the source object. Type must implement <seealso cref="INotifyPropertyChanged"/>.</typeparam>
    /// <param name="source">The object to observe property changes on.</param>
    /// <returns>Returns an observable sequence of the value of the source when ever the <c>PropertyChanged</c> event is raised.</returns>
    public static IObservable<T> OnAnyPropertyChanges<T>(this T source)
        where T : INotifyPropertyChanged
    {
            return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
                                handler => handler.Invoke,
                                h => source.PropertyChanged += h,
                                h => source.PropertyChanged -= h)
                            .Select(_=>source);
    }
}

这将输出:

Lee is 33
Bob is 24
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 SortedList 中 T.MyProperty 上的所有 Property Changed 事件中获取 IObservable 的相关文章

  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd

随机推荐

  • 缓冲区溢出攻击(攻击实验室第 2 阶段)

    我有一个缓冲区溢出实验室 我必须为一个名为攻击实验室 http csapp cs cmu edu 3e attacklab pdf 我处于实验室的第二阶段 我必须将代码作为漏洞利用字符串的一部分注入 以使程序指向函数 touch2 的地址
  • 数据库连接和 OutOfMemoryError:Java 堆空间

    去年夏天 我制作了一个 Java 应用程序 它可以解析一些 PDF 文件并获取它们包含的信息并将其存储在 SQLite 数据库中 一切都很好 我每周左右都会向数据库添加新文件 没有任何问题 现在 我正在尝试提高应用程序的速度 我想看看如果我
  • 将广告注入 Google Chrome 扩展程序

    我正在开发一个 google chrome 扩展 并计划使用允许的功能注入广告 我检查过 广告行为 前面写着 此扩展程序将广告注入一些第三方网站 我的问题是 如何以及在哪里提及广告来源 比如说 如果我想显示 google adsense 我
  • PhoneGap 的 Flash 插件

    我正在phonegap 中开发一个html css javascript 应用程序 在该应用程序中 我需要一个 JavaScript 的 Flash 插件编码 以便为我的应用程序目的启用音频 视频 如果有人知道解决方案 请尽快回复我 您必须
  • 数据集与带有存储过程的实体框架

    整个问题已被重写以更加清晰 新项目设计 SQL Server 2012 Visual Studio 2012 Net 4 5 业务逻辑将在存储过程中实现 ASP Net 网络表单 WCF SOAP XML Web 服务使用 DBA 提供的存
  • Android ViewHolder背景颜色

    我正在创建一个 Android 应用程序 其中包含带有嵌套 CardView 的 RecyclerView 我需要将其他所有卡片更换为不同的颜色 我在用 Override覆盖onBindViewHolder ViewHolder vh in
  • 如何从 Google 新闻 RSS 中抓取 Google 新闻文章内容?

    将来 可能还很遥远 因为我还是个新手 我想做数据分析 基于我从Google News RSS获得的新闻内容 但为此 我需要访问该内容 这就是我的问题 使用网址 https news google cl news rss https news
  • JTextField 在最小化时调整大小

    我在 JFrame 中有一个 JTextField 和一个 JTextArea 但是 当应用程序运行时 如果我最小化窗口 JTextField 的大小就会调整 它的高度通常会增加一倍或三倍 但每次调整大小的方式并不一致 我不知道为什么会发生
  • 在 Plotly 中的单个迹线中显示多个图例

    So the docs https plotly com python legend 几乎使它看起来像是为同一项目的不同项目显示多个图例trace plotly graph objs Scatter 不是这样的东西Plotly默认支持 您应
  • 如何使用 xmlValue 使 xpathSApply 输出长度节点向量?

    可以说我有以下内容 library XML my xml lt
  • JSONSchema - 必需的属性依赖于父属性

    我想根据根模式中属性的存在在数组子模式中应用额外的 必需 属性 我的架构设置如下 schema http json schema org draft 07 schema type object required isParentDepend
  • 启动 Android Netflix 应用程序并传递视频 ID

    在我正在开发的应用程序中 我想支持 Netfilx 流媒体 我打算通过简单地启动 Netflix 并传递特定的 URI 来实现此目的 以便它在启动时播放特定的视频 简单吧 好吧 问题是我不确定如何在用于启动 Activity 的 Inten
  • PHP:gethostbyname 错误

    我在用gethostbyname 获取应用程序中域的 IP 地址 在某些情况下 还会检查 50 9 49 等无效地址 echo gethostbyname 50 9 49 returns 50 9 0 49 在这种情况下gethostbyn
  • 使用 OpenCV-3.0.1 / python 2.7 创建 svm

    这是多么奇怪的系统啊 我在这里遇到了与此问题相同的问题 AttributeError 模块 对象没有属性 SVM LINEAR https stackoverflow com questions 36109874 attributeerro
  • MongoDB-Java中查询数据去除_id并仅显示指定字段

    我正在 Eclipse 中完成一个 Java 项目 作为我大学作业的一部分 该项目的要求之一是将数据写入文本文件并在另一个类中将其读回 不过 我决定使用MongoDB而不是文本文件 数据的格式如下所示 Data https i stack
  • 带工具提示的 Ggplotly 在使用 geom_rect() 时出现问题

    我正在尝试在 ggplotly 图中绘制一些数据 x 轴包含日期 Ggplotly 不能很好地处理日期 因为当我将鼠标悬停在某个点上时 日期会显示为数字 我通过设置如下所示的工具提示解决了这个问题 一些示例数据 x lt data fram
  • 如何让各个班级能够互动呢?

    我需要帮助来理解 iPad iPhone 环境中的 MVC 模型 不知怎的 读了几遍还是无法理解 假设我想构建一个小型应用程序来存储图像位置以及每个图像的注释 我可能会创建一个 SZImage 类来存储这些信息 除了setter和gette
  • 讨论 - 客户端服务器应用程序架构

    我想使用 Net 4 C 和 SQL Server 开发一个基于客户端 服务器的桌面应用程序 Please refer to the image for what i am thinking about 将有一个服务器应用程序访问Windo
  • sem_post/sem_wait 是否比 pthread_mutex_lock/pthread_mutex_unlock 快得多?

    我有一段代码需要快速运行 现在我正在使用pthread mutex lock pthread mutex unlock同步线程 但我发现它对性能有一定的影响 我想知道是否有人对此进行过基准测试sem post sem wait 显著地比 快
  • 从 SortedList 中 T.MyProperty 上的所有 Property Changed 事件中获取 IObservable

    我有一个班级 MyClass实现INotifyPropertyChanged并且有一些实现的属性PropertyChanged When MyClass MyProperty变化 PropertyChanged如预期那样起火 另一个类包含一