MvvmCross 绑定的变化

Changes in MvvmCross bindings

嗨 Xamarin/MvvmCross 开发者,

这只是出于好奇而提出的问题。在我正在开发的其中一个应用程序中,一些行为发生了变化。特别是在 iOS 将 UISwitch "On" 值绑定到 ViewModel 中的布尔值时。 属性 上的 getter 在应用绑定时触发,setter 在翻转开关时触发,但 UI 不反映它。逼我从 just

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。不幸的是我没有检查我从哪个版本升级,但我总是一看到有可用的就升级,所以它应该是以前的稳定版本。

我的问题是:

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

谢谢

正如我们在 OP 的评论中计算出的那样,切换事件已链接出来。因此,绑定什么也没做。

解决此问题的最简单方法是将以下代码添加到您的 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 class 使用 Preserve 属性。