你好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。不幸的是,我没有检查我升级的版本,但是我一看到它就会一直升级,所以它应该是以前的稳定版本。
我的问题是:
如果这个问题更适合其他地方,请告诉我,我只是对这种行为感到好奇。
由于
答案 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属性。