ToProperty 和 BindTo - 无需订阅即可获取初始值

2024-04-24

我在 .NET 4.5 中使用 RXUI 6 和 WPF。

当绑定到的 ViewModel 属性由一个支持时,我一直无法获取提供给我的视图的初始值ObservableAsPropertyHelper.

根据文档 https://github.com/reactiveui/ReactiveUI/blob/master/docs/migrating-from-rxui5.md#toproperty--oaph-changes:

ToProperty / OAPH 变更

  • ObservableAsPropertyHelper 本身不再是 IObservable,使用 WhenAny 来观察它。

  • ObservableAsPropertyHelper 现在仅在第一次读取 Value 时延迟订阅源。这显着
    提高了性能和内存使用率,但代价是一些“为什么
    我的测试不起作用吗?”困惑。如果您发现您的 ToProperty
    “不起作用”,这可能就是原因。

我在看这个问题 https://stackoverflow.com/questions/22432822/observableaspropertyhelper-have-to-access-value-to-get-it-to-subscribe这似乎解决了我同样的问题,但提供的答案在测试中有效并且具有ReactiveCommand。我无法找出最干净的方法来让它在我的情况下与任何IObservable<>不一定是ReactiveCommand(下面过于简化)。

视图模型示例:

public class ViewModel : ReactiveObject
{
    private readonly ObservableAsPropertyHelper<string> _message;

    public ViewModel()
    {
       var someObservable = Observable.Return("Hello");

        _message = someObservable
            .ToProperty(this, t => t.Message);
    }

    public string Message
    {
        get
        {
            return _message.Value;
        }
    }
}

示例视图隐藏代码:

public partial class View : UserControl, IViewFor<ViewModel>
{
     public View()
     {
        InitializeComponent();

        this.WhenAnyValue(t => t.ViewModel.Message)
            .BindTo(this, t => t.MessageTextBlock.Text);
     }
     // ... IViewFor Stuff....
}

所以现在,消息文本框将不包含初始值。但是,如果在我的 ViewModel 中我要将这一行添加到构造函数中:

this.WhenAnyValue(t => t.Message).Subscribe(s => {});

现在它将触发 TextBlock,因为现在有订阅。所以我猜.BindTo()方法实际上从未算作订阅?或者是懒惰之上的懒惰?这个空订阅是否会抵消其懒惰带来的性能优势?或者我不应该使用.BindTo()只需使用一个.Subscribe()分配 TextBlock?

**** 编辑 **** 好吧,我的代码中可能还有其他问题,因为我无法一致地重现这种行为。如果我找到根本原因,我会报告。

* 编辑 2 *我已确认是我的另一个问题导致了失火,而不是 OAPH。 .ToProperty 和 .BindTo 现在似乎按预期一致工作。谢谢。


现在它将触发 TextBlock,因为现在有订阅。所以我猜测 .BindTo() 方法实际上从未算作订阅?

BindTo 立即订阅源并应启动 OAPH。然而,这个订阅实际上不会happen直到 View 获得 ViewModel:

// Can't subscribe to (null).Message!
this.WhenAnyValue(t => t.ViewModel.Message)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ToProperty 和 BindTo - 无需订阅即可获取初始值 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 更改 WPF 应用程序清单?

    我已经发布给微软的评论 http connect microsoft com VisualStudio feedback ViewFeedback aspx FeedbackID 420920WPF 中的对话框未启用 VisualStyle
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var

随机推荐