当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- What is the tensor in tensorflow?
- An article taught you to download cool dog music using Python web crawler
- What grammar is it? ]
- Description of phpshe SMS plug-in
- Common syntax corresponding table of mongodb and SQL
- (2) ASP.NET Core3.1 Ocelot routing
- Staying up late summarizes the key points of report automation, data visualization and mining, which is different from what you think
- Metersphere developer's Manual
- Tron smart wallet PHP development kit [zero TRX collection]
- STM32F030C6T6兼容替换MM32SPIN05PF
猜你喜欢
[forward] how to view UserData in Lua
image operating system windows cannot be used on this platform
Building a new generation cloud native data lake with iceberg on kubernetes
ES6 learning notes (3): teach you to use js object-oriented thinking to realize the function of adding, deleting, modifying and checking tab column
A small goal in 2019 to become a blog expert of CSDN
预留电池接口,内置充放电电路及电量计,迅为助力轻松搞定手持应用
上海巨微专用蓝牙广播芯片
window系统 本机查找端口号占用方法
NAND FLASH的接口控制设计
Understanding formatting principles
随机推荐
磁存储芯片STT-MRAM的特点
Flink's datasource Trilogy: direct API
Zero basis to build a web search engine of its own
How much disk space does a new empty file take?
Can you do it with only six characters?
大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
(2) ASP.NET Core3.1 Ocelot routing
Try to build my mall from scratch (2): use JWT to protect our information security and perfect swagger configuration
Hdu3974 assign the task segment tree DFS order
ES中删除索引的mapping字段时应该考虑的点
Building a new generation cloud native data lake with iceberg on kubernetes
Some operations kept in mind by the front end foundation GitHub warehouse management
es创建新的索引库并拷贝旧的索引库 实践亲测有效!
An article taught you to use HTML5 SVG tags
2020-08-20:GO语言中的协程与Python中的协程的区别?
What is alicloud's experience of sweeping goods for 100 yuan?
2020-08-29:进程线程的区别,除了包含关系之外的一些区别,底层详细信息?
2020-08-24:什么是小文件?很多小文件会有什么问题?很多小文件怎么解决?(大数据)
How does filecoin's economic model and future value support the price of fil currency breaking through thousands
Staying up late summarizes the key points of report automation, data visualization and mining, which is different from what you think