当前位置:网站首页>To solve the problem that the data interface is not updated after WPF binding set
To solve the problem that the data interface is not updated after WPF binding set
2020-11-06 21:30:00 【Irving the procedural ape】
solve WPF After binding the set, the data change interface does not update
Independent observers 2020 year 9 month 9 Japan
stay .NET Core 3.1 Of WPF The program is intended to use ListBox Binding displays a collection ( Just meet the demand , It doesn't matter what kind of set ), Here are Xaml Code ( Just a glance , It's not the point of this article ):
<ListBox ItemsSource="{Binding SipRegistrations, Mode=OneWay}" SelectedValue="{Binding SelectedAccountBinding, Mode=OneWayToSource}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding SIPAccount.SIPUsername}"></TextBlock> </DataTemplate> </ListBox.ItemTemplate></ListBox>
ViewModel There's a set of targets in , The present is a List.
There are two ways to implement property change notification , First, use. PropertyChanged.Fody, Second, use custom binding base class BindableBase, Here's the picture .
The following is mainly about data changes ( Collection adds content ) after , There is no problem of updating the front desk interface . To be specific ,List.Add after , The first time it worked , But then it doesn't work , The interface always displays only one piece of data .
original ( No effect ):
SipRegistrations.RemoveAll(x => x.SIPAccount.SIPUsername == sipAccount.SIPUsername); // Remove duplicates ( If any )SipRegistrations.Add(binding); // Add a new item
Guess because List There is no change in the citation of , So it's thought that the attribute hasn't changed , And then there is no change notice .
In fact, this situation requires notice of change , The recommended use is ObservableCollection:
But I used it before ObservableCollection No success , Instead, use List Yes. , So let's take a look at it first List How to solve it .
Variant one ( Debugging has a chance to have an effect ):
// Add contacts to the collection and handle interface binding ;SipRegistrations.RemoveAll(x => x.SIPAccount.SIPUsername == sipAccount.SIPUsername);List<SIPAccountBinding> tempList = SipRegistrations; // Temporary assembly ;SipRegistrations = new List<SIPAccountBinding>(); // The target set is set to empty first ;tempList.Add(binding); // Temporary collection adds new items ;SipRegistrations = tempList; // The temporary set is assigned to the target set ;
Variant one uses temporary variables as a transit , Force the target set ( References to ) Change , But the result is that only in debugging with a very small probability of success .
Because this part of the code is in asynchronous logic , So it could be in a multithreaded environment , and List Not thread safe , So there's variant 2 of the lock version .
Variant two ( No effect , It should be similar to variant 1 ):
#region member /// <summary>/// Lock object /// </summary>private object _lockObj = new object();#endregion// Lock ;lock (_lockObj){ // Add contacts to the collection and handle interface binding ; SipRegistrations.RemoveAll(x => x.SIPAccount.SIPUsername == sipAccount.SIPUsername); List<SIPAccountBinding> tempList = SipRegistrations; SipRegistrations = new List<SIPAccountBinding>(); tempList.Add(binding); SipRegistrations = tempList;}
It doesn't work with a lock ( But locks are needed ), I think of , Since there is a chance of success when debugging , So is it related to the speed of code running ? So a thread sleep is added between the target set's null and its reassignment , You can really , This is the following Variant 3 .
Variant three ( Effective ):
lock (_lockOb.........
版权声明
本文为[Irving the procedural ape]所创,转载请带上原文链接,感谢
边栏推荐
- A small goal in 2019 to become a blog expert of CSDN
- 解决 WPF 绑定集合后数据变动界面却不更新的问题
- image operating system windows cannot be used on this platform
- ES6 learning notes (5): easy to understand ES6's built-in extension objects
- What is the purchasing supplier system? Solution of purchasing supplier management platform
- Take you to learn the new methods in Es5
- How to start the hidden preferences in coda 2 on the terminal?
- An article will take you to understand CSS3 fillet knowledge
- html+ vue.js Implementing paging compatible IE
- An article takes you to understand CSS pagination examples
猜你喜欢
大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
2020-09-09:裸写算法:两个线程轮流打印数字1-100。
list转换map(根据key来拆分list,相同key的value为一个list)
Take you to learn the new methods in Es5
2020-08-19:TCP是通过什么机制保障可靠性的?
Common syntax corresponding table of mongodb and SQL
2020-08-29:进程线程的区别,除了包含关系之外的一些区别,底层详细信息?
【涂鸦物联网足迹】涂鸦云平台全景介绍
ES6 learning notes (2): teach you to play with class inheritance and class objects
The role of theme music in games
随机推荐
How does cglib implement multiple agents?
Ronglian completed US $125 million f round financing
Application insights application insights use application maps to build request link views
2020-08-19:TCP是通过什么机制保障可靠性的?
Introduction to Huawei cloud micro certification examination
An article will take you to understand SVG gradient knowledge
The native API of the future trend of the front end: web components
list转换map(根据key来拆分list,相同key的value为一个list)
mongo 用户权限 登录指令
Metersphere developer's Manual
Unity performance optimization
ERD-ONLINE 免费在线数据库建模工具
Why is quicksort so fast?
ado.net和asp.net的关系
An article takes you to understand CSS pagination examples
es创建新的索引库并拷贝旧的索引库 实践亲测有效!
Common syntax corresponding table of mongodb and SQL
Junit测试出现 empty test suite
2020-08-18:介绍下MR过程?
STM32F030K6T6兼容替换灵动MM32F031K6T6