热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:如何确保,ViewModel属性在再次更改它之前已经在视图上绑定了?分享

如何确保,ViewModel属性在再次更改它之前已经在视图上绑定了?有以下情况:ViewModel有一个变化非常快的对象。(通过不同的线程)View通过NotifyProperty

如何确保,ViewModel属性在再次更改它之前已经在视图上绑定了?

有以下情况: ViewModel有一个变化非常快的对象。 (通过不同的线程)

View通过NotifyPropertyChanged接口获得通知,但它看起来很慢并且在View绑定新值并绘制之前它会更改次数因此它会错过某些值。

我还尝试将View绑定到队列,然后ViewModel可以将其排队, View可以通过dequeueing绘制。

不幸的是发生了另一个问题:在RaisePropertyChanged(() => queue); View未被告知已更改。

在这种情况下, INotifyPropertyChanged接口的实现不起作用。

你有什么主意吗?

ViewModel示例代码:

 public class ExamplaryViewModel { public ExamplaryViewModel() { Messenger.Default.Register(this, m => ProcessNotificationMessage(m.Content)); } public void ProcessNotificationMessage(Message message) { MessageOftenBeingChanged = message; RaisePropertyChanged(() => MessageOftenBeingChanged ); } } 

View绑定到MessageOftenBeingChanged

另一种选择是按照评论中的建议准备快照:

 public void ProcessNotificationMessage(Message message) { Messages.Enqueue(message); RaisePropertyChanged(() => Messages); } 

View

  

但是,不幸的是, RaisePropertyChanged()方法不会触发发生的变化。

我计划在事件中控制OnQueueChangedChanged尝试出列并只是绘制项目作为段落的新内联。

您可以实现Producer-Consumer 。

看看这个简化版本。

如果是空队列,您可以使用ManualResetMonitor来避免不必要的迭代。

备注你的代码:
如果可以更改集合,那么出于绑定目的,您应该只使用ObservableCollection (或实现INotifyCollectionChanged东西),因为它跟踪更改并且不会重新加载所有内容。

但是在您的代码中,应该刷新整个绑定(因为您已通知整个集合已被更改),但我认为这种机制更智能并检查引用是否相等,如果是,则不进行刷新。 可能是一个hax将它设置为null并返回将刷新它:-)。

通过许多调查我决定通过任何装饰器绑定到RichText框,带有额外DependencyProperty和Converter的自定义控件效率不高。

我的结论表明,构建自定义的richTextbox毫无价值 – 并确保在更改之前显示新值。

我辞职直接绑定。

我在缓冲区 – 队列中收集任何新消息。

我决定使用类似于消费者的东西(正如Wojciech Kulik建议的那样)

我将我的消费者基于TimeDispatcher,它在Tick的间隔中检查队列中是否存在任何新消息。 如果为真,那么它会出列并收集它,最后是RaiseMonitorItemsAdd。

查看事件上方的句柄:

  if (dataContext is IMonitorable) { COntext= dataContext as IMonitorable; Context.MonitorViewModel.RaiseMonitorItemAdd += MonitorViewModelOnRaiseMonitorItemAdd; Context.MonitorViewModel.RaiseMonitorCleared += MonitorViewModel_RaiseMonitorCleared; } private void MonitorViewModelOnRaiseMonitorItemAdd(object sender, MonitorEventArgs monitorEventArgs) { Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { _paragraph.Inlines.AddRange(MonitorItemConverter.ConvertToInlines(monitorEventArgs.MonitorItem)); _richTextBox.ScrollToEnd(); })); } 

更多在RichTextBox获得许多项目的情况下,我将整个日志转储到文件。

上述就是C#学习教程:如何确保,ViewModel属性在再次更改它之前已经在视图上绑定了?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
nicknick-AUG
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有