【问题标题】:Changes in MvvmCross bindingsMvvmCross 绑定的变化
【发布时间】:2016-09-20 22:59:13
【问题描述】:

您好 Xamarin/MvvmCross 开发人员,

这只是出于好奇而提出的问题。在我正在开发的其中一个应用程序中,一些行为发生了变化。特别是在 iOS 上,将 UISwitch“On”值绑定到 ViewModel 中的布尔值。属性上的 getter 会在应用绑定时触发,以及在切换开关时触发 setter,但 UI 不会反映它。强迫我离开只是

var set = this.CreateBindingSet<SettingsView, SettingsViewModel>();
set.Bind(PushNotificationSwitch).For(s => s.On)
   .To(vm => vm.ReceivePushNotifications);
set.Apply();

还必须在其下方添加以下内容(以使开关的 UI 反映该值)

var settingsViewModel = ((SettingsViewModel)ViewModel);
PushNotificationSwitch.On = settingsViewModel.ReceivePushNotifications;

我留下了绑定,以及反映 UI 状态的新代码,因为除了 UI 只是反映正确的状态之外,我还希望它在用户更改时更改我的 settingsService 中的状态。

我最近通过 Mac 上的 Xamarin Studio 进行了升级,我的 iOS Xam 版本是版本:10.0.0.6。不幸的是,我没有检查我从哪个版本升级,但我总是在看到有可用版本时立即升级,所以它应该是以前的稳定版本。

我的问题是:

  • 你们中是否有人遇到过类似的问题,即以这种方式更改绑定?
  • 由于 Android 绑定仍然可以正常工作,您认为这是 MvvmCross 或 iOS Xamarin Changes 中的问题
  • 关于可能导致此问题的任何推测?以及您认为这可能会影响的其他部分,因此如果不存在错误,我将不必寻找错误。命令、文本和自定义控件绑定工作正常(据我测试)

如果这个问题更适合其他地方,请告诉我,我只是对这种行为感到好奇。

谢谢

【问题讨论】:

  • 这种行为是在调试和发布版本上都显示还是仅在其中一个上显示?可能是链接器正在剥离代码。您的 LinkerPleaseInclude 文件中是否有任何用于开关的代码?
  • @Cheesebaron 调试和发布都会发生这种情况,我的 LinkerPleaseInclude 文件中没有任何开关代码。
  • 你可以尝试添加:public void Include(UISwitch sw) { sw.On = !sw.On; sw.ValueChanged += (sender, args) =&gt; { sw.On = false; }; }
  • @Cheesebaron 工作了 :) 添加后查看日志,发现三周前 MvvmCross 的升级删除了它,我最近才回到项目,所以在我的脑海中是与 Xamarin 升级有关。我对没有正确检查不好。谢谢。
  • 有帮助吗??

标签: xamarin xamarin.ios mvvmcross


【解决方案1】:

正如我们在 OP 的 cmets 中制定的那样,切换事件已被链接。因此,绑定什么也没做。

解决此问题的最简单方法是将以下代码添加到您的 LinkerPleaseInclude.cs 文件中,该文件是 MvvmCross 在 Startup NuGet 中以及通过 Visual Studio 和 Xamarin Studio 可用的模板提供的:

public void Include(UISwitch sw) 
{ 
    sw.On = !sw.On;
    sw.ValueChanged += (sender, args) => 
    { 
        sw.On = false; 
    }; 
}

这将告诉链接器直接使用 ValueChanged 事件和 On 属性,因为 LinkerPleaseInclude 类使用 Preserve 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2017-07-18
    • 2013-10-17
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多