当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- To Lianyun analysis: why is IPFs / filecoin mining so difficult?
- Behind the record breaking Q2 revenue of Alibaba cloud, the cloud opening mode is reshaping
- 上海巨微专用蓝牙广播芯片
- Why is quicksort so fast?
- git远程库回退指定版本
- 行为型模式之备忘录模式
- Contract trading system development | construction of smart contract trading platform
- 【学习】接口测试用例编写和测试关注点
- Open source a set of minimalist front and rear end separation project scaffold
- Zero basis to build a web search engine of its own
猜你喜欢

非易失性MRAM存储器应用于各级高速缓存

STM32F030C6T6兼容替换MM32SPIN05PF

Look! Internet, e-commerce offline big data analysis best practice! (Internet disk link attached)

How to start the hidden preferences in coda 2 on the terminal?

大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术

Novice guidance and event management system in game development

STM32F030K6T6兼容替换灵动MM32F031K6T6

The role of theme music in games

Summary of common SQL statements

面试官: ShardingSphere 学一下吧
随机推荐
Top 5 Chinese cloud manufacturers in 2018: Alibaba cloud, Tencent cloud, AWS, telecom, Unicom
Using an example to understand the underlying processing mechanism of JS function
2020-08-15:什么情况下数据任务需要优化?
Junit测试出现 empty test suite
2020-08-30:裸写算法:二叉树两个节点的最近公共祖先。
面试官: ShardingSphere 学一下吧
The role of theme music in games
Helping financial technology innovation and development, atfx is at the forefront of the industry
Will blockchain be the antidote to the global epidemic accelerating the transformation of Internet enterprises?
Behind the record breaking Q2 revenue of Alibaba cloud, the cloud opening mode is reshaping
The native API of the future trend of the front end: web components
window系统 本机查找端口号占用方法
[elastic search engine]
Share with Lianyun: is IPFs / filecoin worth investing in?
嘉宾专访|2020 PostgreSQL亚洲大会阿里云数据库专场:曾文旌
mongo 用户权限 登录指令
EOS founder BM: what's the difference between UE, UBI and URI?
Python 100 cases
2020-08-18:介绍下MR过程?
Try to build my mall from scratch (2): use JWT to protect our information security and perfect swagger configuration