MvvmCross绑定的变化

时间:2016-09-20 07:19:48

标签: xamarin xamarin.ios mvvmcross

你好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中的问题
  • 有关可能导致此问题的任何猜测?您认为这可能会影响其他部分,所以如果不存在错误,我不会去寻找错误。命令,文本和自定义控件绑定工作正常(据我测试过)

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

由于

1 个答案:

答案 0 :(得分:3)

正如我们在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类使用Preserve属性。