Xamarin.Forms:为啥 IValueConverter 的过程不会永远打乒乓球?
Posted
技术标签:
【中文标题】Xamarin.Forms:为啥 IValueConverter 的过程不会永远打乒乓球?【英文标题】:Xamarin.Forms: How come the process of IValueConverter doesn't play ping pong for ever?Xamarin.Forms:为什么 IValueConverter 的过程不会永远打乒乓球? 【发布时间】:2020-11-25 20:38:21 【问题描述】:在 Xamarin.Forms 中,我实现了接口 IValueConverter。
public class NiceConverter : IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
string valueAsString = value as string;
return valueAsString + "SP";
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
string valueAsString = value as string;
return valueAsString + "GP";
在 XML 部分中,我绑定了一个 Entry 文本,并指定我使用该转换器:
<ContentPage.Resources>
<convertorsNS:NiceConverter x:Key="myAddDollarSignConverter"/>
</ContentPage.Resources>
<StackLayout>
<Entry x:Name="myTextEntry" Text="Binding NiceString ,
Converter = StaticResource NiceConverter , Mode=TwoWay"/>
我希望每当我在条目中键入一个字符时,可以说“A”, ConvertBack() 将被调用,因此字符串 'AGP' 将是 发送到源绑定属性,
但现在这会导致来源发生变化 绑定属性,所以 Convert () 会被调用,所以 字符串“AGPSP”将被发送到目标,
但是现在这会导致 Target 发生变化, 所以现在将再次调用 ConvertBack(),因此字符串 AGPSPGP 将被发送到源
但是现在这会导致来源发生变化...
...这样我希望它会一直持续下去。
我当然错了。你能告诉我在哪里吗?
【问题讨论】:
NiceString
属性在哪里定义?我猜 setter 或属性更改调用发生了什么事。
@Andrew 嗨,NiceString 是在作为绑定上下文的视图模型中定义的。 viewModel实现了INotifyPropertyChanged,NiceString就ok了。问题是条目文本的更改会导致调用 ConvertBack() ,这会更改 NiceString - 这会导致调用 Convert() ,因此它会更改条目 Text 并且......就是这样。它停止了。
【参考方案1】:
这样,我希望它会一直持续下去。
文本不会按预期显示,会导致死循环,此时应用程序挂起。
Xamarin Team 似乎已经修复了在创建绑定时在 Entry 上使用转换器会导致无限循环的问题。
检查以下线程,问题之前确实存在。
https://forums.xamarin.com/discussion/92310/two-way-binding-with-a-converter-causing-an-infinite-loop
Entry value converter hangs converting and converting back again and again
Xamarin forms value converter causing infinite loop
【讨论】:
嗨,我已经阅读了所有 3 个链接。所有这些链接都描述了想要的情况:-) 这是我所期望的 - 一个无限循环。出于某种原因,我没有得到无限循环。条目文本的更改会导致调用 ConvertBack(),这会更改 NiceString - 这会导致调用 Convert(),因此会更改条目 Text 并且....就是这样。它停止了。现在,有可能正如您所写的“Xamarin Team 似乎已经解决了这个问题”,但我对这样的修复一无所知。你看过一些关于它的文档吗? 没有关于修复的文档,之前相同的代码会导致问题,但现在永远不会发生无限循环,您可以在 github 上提出问题以获取更多详细信息:github.com/xamarin/Xamarin.Forms/issues。以上是关于Xamarin.Forms:为啥 IValueConverter 的过程不会永远打乒乓球?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Xamarin.Forms 控件在 StackLayout 中重叠?
为啥 Xamarin Forms 对所有页面使用一个 Activity
为啥在使用 Prism 在 Xamarin.Forms 中导航到 root 时,我的 NavigationPage 顶部会出现默认标题?
为啥使用 Xamarin Forms 的 iOS 应用程序不显示 Font Awesome?
为啥我不能在 Xamarin Forms 中选择 PCL 项目?
为啥我无法从我的 Xamarin.Forms UWP 应用程序访问 DownloadsFolder,并获得 System.UnauthorizedAccessException?