Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin窗体清单视图不更新GUI

我正在尝试创建一个聊天页面。有一个列表视图,其项目源是一个ObservableCollection。在将项目添加到ObservableCollection之前,一切似乎都进行得很顺利。添加的项目不会立即出现在屏幕上,只有在触摸屏幕之后才会显示出来。

事实上,我的问题与这里提到的问题相同:https://forums.xamarin.com/discussion/18631/listview-binding-to-observablecollection-does-not-update-gui/p2

我相信线程(第2页)中提到的解决方案之一与INotifyPropertyChanged有关。经过多次尝试应用解决方案以满足我的需要,我无法这样做。请你引导我走正确的方向好吗?

我的代码是摘要,如下所示:

代码语言:javascript
运行
AI代码解释
复制
public partial class Chat : ContentPage
{
    private ObservableCollection<MessageObj> Messages = new ObservableCollection<MessageObj>();

    public Chat(string name, string imageURL, int UID)
    {
        msgList.ItemsSource = Messages; //msgList is ListView in XAML
    }

    public class MessageObj
    {
        public string Mess { get; set; }
        public TextAlignment textAlignment { get; set; }

        public MessageObj(string Mess, TextAlignment textAlignment)
        {
            this.Mess = Mess;
            this.textAlignment = textAlignment;
        }
    }
}

我也读过:ListView ObservableCollection不更新,我想我正在改变收藏,所以我不应该面对这个问题,但我是任何帮助/洞察力都将不胜感激!

我添加了一个包含我的代码以供参考的要点,它显示了我现在对不同解决方案的评论尝试:https://gist.github.com/Dobermensch/49ee9d8adb9a83a38790b691c857691d

编辑:在gist中添加了一些最初省略的代码

Edit2: FYI,我不使用MVVM模式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-17 18:27:05

正如您在注释中所阐明的,问题在于在OnMessageReceived回调期间从SendBird API接收到的消息。通过阅读他们的文档,他们似乎不会与UI线程同步调用回调。

Xamarin应用程序可以是多线程的,并且有一个主要的UI线程,它必须涉及到UI的所有更新。在许多应用程序中,您编写的代码都将在UI线程上运行,除非您执行Task.Run()await <some async task>.ConfigureAwait(false)之类的操作来强制用户界面线程之外的工作。所以通常您不必担心UI与非UI线程之间的关系。用户与UI交互的回调,就像单击按钮一样,也在UI线程上运行。来自非UI源的回调可能在UI线程上,也可能不在UI线程上(取决于实现和运气),我怀疑情况就是这样。

根据您正在使用的平台的不同,如果尝试从不是UI线程的代码中更改UI,则可能会出现不同的情况。有时您会遇到崩溃(典型的iOS响应),或者只是不会立即更新(常见的安卓行为)。

因此,我要尝试的是使用Device.BeginInvokeOnMainThread强制在UI线程上进行集合更新,如下所示:

代码语言:javascript
运行
AI代码解释
复制
        ch.OnMessageReceived = (BaseChannel baseChannel, BaseMessage baseMessage) => {
            Device.BeginInvokeOnMainThread(() =>
            {
                Messages.Add(new MessageObj(((UserMessage)baseMessage).Message, TextAlignment.Start));
                msgList.ScrollTo(Messages.Last(), ScrollToPosition.End, false);
            };
        };

这将告诉UI线程执行将MessageObj添加到消息的工作,因此各种PropertyChanged事件也将在UI线程上处理,后者将知道如何实际更新UI。

票数 1
EN

Stack Overflow用户

发布于 2019-10-08 08:41:32

经过大量的调试和测试,我发现了一个类似的问题: GUI没有更新是因为ListViewListView,而不是因为ObservableCollection而不是

ItemsSource设置为null,然后使用ObservableCollection再次设置它,使GUI更新。

虽然我希望能得到更好的解决办法,但却找不到。

代码语言:javascript
运行
AI代码解释
复制
Device.BeginInvokeOnMainThread(() => {
    Context.WarmupOptions[0].IsChecked = !Context.WarmupOptions[0].IsChecked;
    mylist.ItemsSource = null;
    mylist.ItemsSource = Context.WarmupOptions;
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54732669

复制
相关文章
Object 类型
ECMAScript中大多数的引用类型都值都是Object类型的实例,Object也是使用最多的一个类型,主要用来在程序中存储和传输数据
河岸飞流
2019/09/11
5390
JavaScript引用类型之Object类型
在JavaScript中大多数的引用类型都是Object的实例,Object类型也是使用最多的类型! 创建Object类型实例的方式有两种,下面分别来分析一下: (1)第一种是使用new操作符后跟Object构造函数,代码如下: var perosn=new Object(); person.name="张三"; person.age=22; (2)第二种方式使用对象字面量表示法。对象字面量是对象定义的一种简写方式,目地就是为了简化创建含有大量属性和方法的对象的过程。代码如下: var person={ n
郑小超.
2018/01/24
8890
变量类型测试函数的使用:六、is_object的用法
讲完PHP变量类型测试函数【is_array】的用法,今天来讲讲PHP变量类型测试函数【is_object】的用法。
大脸猫
2020/07/06
7110
变量类型测试函数的使用:六、is_object的用法
匿名类型和Object转换
本文转载:http://www.cnblogs.com/JustRun1983/archive/2012/05/13/2497997.html
跟着阿笨一起玩NET
2018/09/18
8000
一文读懂 TS 中 Object, object, {} 类型之间的区别
TypeScript 2.2 引入了被称为 object 类型的新类型,它用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:string、boolean、number、bigint、symbol、null 和 undefined。
阿宝哥
2020/04/08
18.2K0
判断Object中数据类型(已知类型、未知类型))
接收到的数据类型为Object,如果知道数据的类型可以使用ObjectMapper进行处理,得到里面的参数。
ha_lydms
2023/08/09
3120
object到底是什么类型
instanceof运算符用来判断某个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上。
用户7293182
2022/01/06
3970
object到底是什么类型
java中将Object类型转换成String类型[通俗易懂]
从下图(a图)的String类的valueOf(Object)的源码可以看到,当传入的值为null的时候返回的是“null”字符串,而不是null,所以在这里如果想判断这个string的值不为空的时候,应该用字段串相关判断不为空的方法例如用equals方法。示例如下(b图)
全栈程序员站长
2022/08/30
1.3K0
java中将Object类型转换成String类型[通俗易懂]
JS原生引用类型解析1-Object类型
(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)
love丁酥酥
2018/08/27
2.2K0
ElasticSearch数据类型Object介绍
JSON文档本质上是分层的:文档可能包含内部对象,而内部对象又可能包含内部对象本身:
xdd
2022/07/12
1.2K0
红宝书 📒 6.1 集合应用类型-object
字面量的声明方式更为常用。在使用对象字面量表示法定义对象时,并不会实际调用Object构造函数。
用户4793865
2023/01/12
2650
TypeScript-never和object类型、类型断言概述
TypeScript 中的 "never" 类型表示一个永远不会发生正常结束的函数返回值类型,通常在异常处理或无限循环中使用。这有助于标识代码中的潜在问题和错误流程。
杨不易呀
2023/09/28
2680
TypeScript-never和object类型、类型断言概述
js中Object类型的一些特点
这种方法简单,直接,但感觉也太随意了,当需要定义大量的属性或方法时,会给人一种凌乱不堪的感觉。
风柏杨4711
2021/03/15
1K0
java string 转 object_java 类型转换 Object和String互转
但是,使用toString()的对象不能为null,否则会抛出异常java.lang.NullPointerException
全栈程序员站长
2022/09/05
2.5K0
【Flutter】Dart 数据类型 ( var 数据类型 | Object 数据类型 )
var 也是定义变量的关键字 , 使用 var 声明变量 , 也是 由系统根据该变量的 赋值 自动 推断该变量的数据类型 ; 该用法与 dynamic 关键字定义的变量类似 ;
韩曙亮
2023/03/28
3K0
【Flutter】Dart 数据类型 ( var 数据类型 | Object 数据类型 )
无法解析类型java.lang.Object_java类型转换异常
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xxx.xxxx.entity.xxxx
全栈程序员站长
2022/10/03
1.2K0
无法解析类型java.lang.Object_java类型转换异常
Java-类型转换,String转Object和Object转String「建议收藏」
String 转换 Object : 使用类似 Obj.parseObj(String) , Obj.valueOf(String)
全栈程序员站长
2022/06/30
6K0
Java-类型转换,String转Object和Object转String「建议收藏」
Dart 中变量类型 var, Object, dynamic 区别
Dart 中弱类型有var, Object 以及dynamic,本文主要探讨一下这三者的区别
莫斯
2020/09/10
1.6K0
Dart 中变量类型 var, Object, dynamic 区别
Object转换为String[]数组,或者其他类型的数组
可以通过向下转型来获得,但是不知道为什么包类异常,最后我采用的方法如下:
全栈程序员站长
2022/09/02
2.7K0
点击加载更多

相似问题

错误:预期的声明,使用未声明的类型'Object',使用未声明的类型'JSON‘

10

未声明类型的使用

12

“‘object”未声明<在此function>中首次使用

21

未声明类型"NSManagedObjectModel“的使用

14

未声明类型“MessagingDelegate”的使用

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档