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?