从 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 的相关文章

  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 缓冲区溢出攻击(攻击实验室第 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如预期那样起火 另一个类包含一