From 4b51532a3173f688a550f5fa75403bde41039e0e Mon Sep 17 00:00:00 2001 From: Laurent Bugnion Date: Sat, 23 Jan 2016 17:43:53 +0100 Subject: [PATCH] Added TargetNullValue for Binding (used when the Source property is null). Added FallbackValue for Binding (used when there is an error in the binding resolution) Added a SetCommand overload without an eventName parameter: Works for Button.Click (Android), CheckBox.CheckedChange (Android), UIButton.TouchUpInside (iOS), UIBarButtonItem.Clicked (iOS). Added a SetCommand overload with a value for CommandParameter. SetCommand now supports binding for CommandParameter (in case the value changes) and a non changing value. --> public static void SetCommand( this object element, RelayCommand command, T commandParameter) Modified SetCommand (non generic) to support ICommand instead of RelayCommand. Replaced UpdateSourceTrigger with ObserveSourceEvent, and UpdateTargetTrigger with ObserveTargetEvent. The old names were too confusing. UpdateSourceTrigger and UpdateTargetTrigger are still there but marked Obsolete. Cleanup up and refactored the Binding class in partial classes for neatness. Added a bunch of unit tests for iOS and Android (not all features are unit tested yet but it's a good start). Renamed solution Galasoft.MvvmLight (VS2013) in Galasoft.MvvmLight (VS2015). --- .../GalaSoft.MvvmLight (VS2013).sln | 572 ------ .../GalaSoft.MvvmLight (VS2015).sln | 1668 +++++++++++++++++ ...laSoft.MvvmLight.Platform (Android).csproj | 4 + .../Helpers/Binding.cs | 10 +- .../Helpers/BindingGeneric.cs | 898 ++++----- .../Helpers/BindingGenericAndroid.cs | 170 ++ .../Helpers/BindingGenericObsolete.cs | 108 ++ .../Helpers/BindingGenericObsoleteAndroid.cs | 102 + .../Helpers/Extensions.cs | 616 ++++-- .../Helpers/ExtensionsAndroid.cs | 88 + .../Helpers/IWeakEventListener.cs | 2 +- .../Helpers/PropertyChangedEventManager.cs | 212 +-- .../GalaSoft.MvvmLight.Platform (iOS).csproj | 6 + .../Helpers/BindingGenericApple.cs | 177 ++ .../Helpers/BindingGenericObsoleteApple.cs | 93 + .../Helpers/ExtensionsApple.cs | 102 + .../Helpers/ObservableTableViewController.cs | 40 +- .../AndroidTestApp/Assets/AboutAssets.txt | 19 + .../AndroidTestApp/Binding/BindingTest.cs | 261 +++ .../Binding/ObserveEventImplicitTest.cs | 404 ++++ .../Binding/ObserveEventLostFocusTest.cs | 404 ++++ .../Binding/ObserveEventNoArgumentTest.cs | 375 ++++ .../ObserveEventNonDefaultEventTest.cs | 70 + .../ObserveEventPropertyChangedTest.cs | 375 ++++ .../Binding/ObserveEventTest.cs | 423 +++++ .../AndroidTestApp/Binding/SetCommandTest.cs | 389 ++++ .../Binding/UpdateTriggerImplicitTest.cs | 404 ++++ .../Binding/UpdateTriggerLostFocusTest.cs | 404 ++++ .../Binding/UpdateTriggerNoArgumentTest.cs | 375 ++++ .../UpdateTriggerNonDefaultEventTest.cs | 70 + .../UpdateTriggerPropertyChangedTest.cs | 375 ++++ .../Binding/UpdateTriggerTest.cs | 423 +++++ .../Tests/AndroidTestApp/Controls/ButtonEx.cs | 41 + .../GalaSoft.MvvmLight.Test (Android).csproj | 141 ++ .../Tests/AndroidTestApp/MainActivity.cs | 23 + .../Properties/AndroidManifest.xml | 5 + .../AndroidTestApp/Properties/AssemblyInfo.cs | 30 + .../Resources/AboutResources.txt | 44 + .../Resources/Resource.Designer.cs | 194 ++ .../Resources/drawable/Icon.png | Bin 0 -> 4147 bytes .../Resources/values/Strings.xml | 5 + .../AndroidTestApp/ViewModel/CommandImpl.cs | 33 + .../AndroidTestApp/ViewModel/TestModel.cs | 19 + .../AndroidTestApp/ViewModel/TestViewModel.cs | 86 + .../Tests/AppleTestApp/AppDelegate.cs | 35 + .../Binding/ObserveEventImplicitTest.cs | 403 ++++ .../Binding/ObserveEventNoArgumentTest.cs | 421 +++++ .../ObserveEventPropertyChangedTest.cs | 421 +++++ .../AppleTestApp/Binding/ObserveEventTest.cs | 421 +++++ .../AppleTestApp/Binding/SetCommandTest.cs | 519 +++++ .../Binding/UpdateTriggerImplicitTest.cs | 403 ++++ .../Binding/UpdateTriggerNoArgumentTest.cs | 421 +++++ .../UpdateTriggerPropertyChangedTest.cs | 421 +++++ .../AppleTestApp/Binding/UpdateTriggerTest.cs | 421 +++++ .../Controls/UIBarButtonItemEx.cs | 31 + .../Tests/AppleTestApp/Controls/UIButtonEx.cs | 31 + .../Tests/AppleTestApp/Controls/UISwitchEx.cs | 48 + .../AppleTestApp/Controls/UITextViewEx.cs | 48 + .../Tests/AppleTestApp/Entitlements.plist | 5 + .../GalaSoft.MvvmLight.Test (iOS).csproj | 176 ++ .../Tests/AppleTestApp/GettingStarted.Xamarin | 4 + .../Tests/AppleTestApp/Info.plist | 32 + GalaSoft.MvvmLight/Tests/AppleTestApp/Main.cs | 15 + .../AppleTestApp/Properties/AssemblyInfo.cs | 36 + .../AppleTestApp/Resources/LaunchScreen.xib | 43 + 65 files changed, 13195 insertions(+), 1420 deletions(-) delete mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2013).sln create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2015).sln create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericAndroid.cs create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsolete.cs create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsoleteAndroid.cs create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/ExtensionsAndroid.cs create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericApple.cs create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericObsoleteApple.cs create mode 100644 GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ExtensionsApple.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Assets/AboutAssets.txt create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/BindingTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventImplicitTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventLostFocusTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNoArgumentTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNonDefaultEventTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventPropertyChangedTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/SetCommandTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerImplicitTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerLostFocusTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNoArgumentTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNonDefaultEventTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerPropertyChangedTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Controls/ButtonEx.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/GalaSoft.MvvmLight.Test (Android).csproj create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/MainActivity.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AndroidManifest.xml create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AssemblyInfo.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/AboutResources.txt create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/Resource.Designer.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/drawable/Icon.png create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/values/Strings.xml create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/CommandImpl.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestModel.cs create mode 100644 GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestViewModel.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/AppDelegate.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventImplicitTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventNoArgumentTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventPropertyChangedTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/SetCommandTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerImplicitTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerNoArgumentTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerPropertyChangedTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerTest.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIBarButtonItemEx.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIButtonEx.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UISwitchEx.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UITextViewEx.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Entitlements.plist create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/GalaSoft.MvvmLight.Test (iOS).csproj create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/GettingStarted.Xamarin create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Info.plist create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Main.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Properties/AssemblyInfo.cs create mode 100644 GalaSoft.MvvmLight/Tests/AppleTestApp/Resources/LaunchScreen.xib diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2013).sln b/GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2013).sln deleted file mode 100644 index aa9b492..0000000 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2013).sln +++ /dev/null @@ -1,572 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (PCL)", "GalaSoft.MvvmLight (PCL)\GalaSoft.MvvmLight (PCL).csproj", "{6A912701-3BA1-4975-ADBF-160CAF66B640}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PNET45)", "Tests\PCL\GalaSoft.MvvmLight.Test (PNET45)\GalaSoft.MvvmLight.Test (PNET45).csproj", "{59378F82-F92D-457E-8FB1-B7799A7A919B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestViews", "TestViews", "{B25F0638-578E-4E2A-9783-23EB99B525BE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PNET45)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PNET45)\GalaSoft.MvvmLight.TestView (PNET45).csproj", "{AAE11955-7DF4-4758-9024-C5247BDE0368}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{99D5856E-95ED-49B6-9F0C-0A5878A87009}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (NET45)", "GalaSoft.MvvmLight.Platform (NET45)\GalaSoft.MvvmLight.Platform (NET45).csproj", "{0722B3DB-76CD-4562-BEA9-5C5C416B6A39}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WIN81)", "GalaSoft.MvvmLight.Platform (WIN81)\GalaSoft.MvvmLight.Platform (WIN81).csproj", "{8E1FCE57-FD06-44ED-B2BC-6D935329630E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PWIN81)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PWIN81)\GalaSoft.MvvmLight.TestView (PWIN81).csproj", "{2CFF4493-5482-465C-A02C-784435861343}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PWPSL81)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PWPSL81)\GalaSoft.MvvmLight.TestView (PWPSL81).csproj", "{BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WPSL81)", "GalaSoft.MvvmLight.Platform (WPSL81)\GalaSoft.MvvmLight.Platform (WPSL81).csproj", "{588595A3-48D5-4A2C-930A-59C5123A07CD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWPSL81)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWPSL81)\GalaSoft.MvvmLight.Test (PWPSL81).csproj", "{29B2A5BA-2E0A-484A-866D-41CCE7144521}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWP81)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWP81)\GalaSoft.MvvmLight.Test (PWP81).csproj", "{B59BBF25-4D29-4B1F-AB02-588AC4032E9E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WP81)", "GalaSoft.MvvmLight.Platform (WP81)\GalaSoft.MvvmLight.Platform (WP81).csproj", "{0A0F720A-2A59-4276-93BC-B4BBEC2D187F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (NET4)", "GalaSoft.MvvmLight (NET4)\GalaSoft.MvvmLight (NET4).csproj", "{36A3299E-5BC9-46D1-8A8F-9D85E3B58529}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (NET4)", "Tests\GalaSoft.MvvmLight.Test (NET4)\GalaSoft.MvvmLight.Test (NET4).csproj", "{30EFC165-77CE-4AC3-B99B-7998D5E39749}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (NET4)", "GalaSoft.MvvmLight.Extras (NET4)\GalaSoft.MvvmLight.Extras (NET4).csproj", "{DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (NET35)", "GalaSoft.MvvmLight (NET35)\GalaSoft.MvvmLight (NET35).csproj", "{80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (NET35)", "GalaSoft.MvvmLight.Extras (NET35)\GalaSoft.MvvmLight.Extras (NET35).csproj", "{B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (NET35)", "Tests\GalaSoft.MvvmLight.Test (NET35)\GalaSoft.MvvmLight.Test (NET35).csproj", "{0F66F445-5DF0-4064-8214-3D16FF924E88}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PWP81)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PWP81)\GalaSoft.MvvmLight.TestView (PWP81).csproj", "{E924C358-8AFD-4B47-903D-5760221AA05C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (PCL)", "GalaSoft.MvvmLight.Extras (PCL)\GalaSoft.MvvmLight.Extras (PCL).csproj", "{39C71A69-4ACE-4B45-9A2C-C274FADA78EF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWIN81)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWIN81)\GalaSoft.MvvmLight.Test (PWIN81).csproj", "{DB6CF16F-315E-4BBD-8348-369905645838}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WPSL80)", "GalaSoft.MvvmLight.Platform (WPSL80)\GalaSoft.MvvmLight.Platform (WPSL80).csproj", "{5E668BEC-ADF7-4F85-AC28-685863160494}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWPSL80)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWPSL80)\GalaSoft.MvvmLight.Test (PWPSL80).csproj", "{3620804D-B56B-4C22-B987-AAD7B7F40FC8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (Android)", "GalaSoft.MvvmLight.Platform (Android)\GalaSoft.MvvmLight.Platform (Android).csproj", "{A5B7741D-E331-438C-B3BF-596B048DB622}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (SL5)", "GalaSoft.MvvmLight (SL5)\GalaSoft.MvvmLight (SL5).csproj", "{4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (SL5)", "GalaSoft.MvvmLight.Extras (SL5)\GalaSoft.MvvmLight.Extras (SL5).csproj", "{F0428C63-C7AD-4563-AC05-81EAA4D76D28}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (SL5)", "Tests\GalaSoft.MvvmLight.Test (SL5)\GalaSoft.MvvmLight.Test (SL5).csproj", "{0E24C663-BDCB-4702-864B-A850A9C68F03}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (iOS)", "GalaSoft.MvvmLight.Platform (iOS)\GalaSoft.MvvmLight.Platform (iOS).csproj", "{DE2FB1EC-A248-4980-A5E3-6835231D84CD}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM = Debug|ARM - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM - Release|Mixed Platforms = Release|Mixed Platforms - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|ARM.ActiveCfg = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|x64.ActiveCfg = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|x86.ActiveCfg = Debug|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Any CPU.Build.0 = Release|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|ARM.ActiveCfg = Release|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|x64.ActiveCfg = Release|Any CPU - {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|x86.ActiveCfg = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|ARM.ActiveCfg = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|x64.ActiveCfg = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|x86.ActiveCfg = Debug|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Any CPU.Build.0 = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|ARM.ActiveCfg = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|x64.ActiveCfg = Release|Any CPU - {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|x86.ActiveCfg = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|ARM.ActiveCfg = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|x64.ActiveCfg = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|x86.ActiveCfg = Debug|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Any CPU.Build.0 = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|ARM.ActiveCfg = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|x64.ActiveCfg = Release|Any CPU - {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|x86.ActiveCfg = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|ARM.ActiveCfg = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|x64.ActiveCfg = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|x86.ActiveCfg = Debug|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Any CPU.Build.0 = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|ARM.ActiveCfg = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|x64.ActiveCfg = Release|Any CPU - {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|x86.ActiveCfg = Release|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|ARM.ActiveCfg = Debug|ARM - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|ARM.Build.0 = Debug|ARM - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x64.ActiveCfg = Debug|x64 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x64.Build.0 = Debug|x64 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x86.ActiveCfg = Debug|x86 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x86.Build.0 = Debug|x86 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Any CPU.Build.0 = Release|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|ARM.ActiveCfg = Release|ARM - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|ARM.Build.0 = Release|ARM - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x64.ActiveCfg = Release|x64 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x64.Build.0 = Release|x64 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x86.ActiveCfg = Release|x86 - {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x86.Build.0 = Release|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CFF4493-5482-465C-A02C-784435861343}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CFF4493-5482-465C-A02C-784435861343}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {2CFF4493-5482-465C-A02C-784435861343}.Debug|ARM.ActiveCfg = Debug|ARM - {2CFF4493-5482-465C-A02C-784435861343}.Debug|ARM.Build.0 = Debug|ARM - {2CFF4493-5482-465C-A02C-784435861343}.Debug|ARM.Deploy.0 = Debug|ARM - {2CFF4493-5482-465C-A02C-784435861343}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|x64.ActiveCfg = Debug|x64 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|x64.Build.0 = Debug|x64 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|x64.Deploy.0 = Debug|x64 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|x86.ActiveCfg = Debug|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|x86.Build.0 = Debug|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Debug|x86.Deploy.0 = Debug|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CFF4493-5482-465C-A02C-784435861343}.Release|Any CPU.Build.0 = Release|Any CPU - {2CFF4493-5482-465C-A02C-784435861343}.Release|Any CPU.Deploy.0 = Release|Any CPU - {2CFF4493-5482-465C-A02C-784435861343}.Release|ARM.ActiveCfg = Release|ARM - {2CFF4493-5482-465C-A02C-784435861343}.Release|ARM.Build.0 = Release|ARM - {2CFF4493-5482-465C-A02C-784435861343}.Release|ARM.Deploy.0 = Release|ARM - {2CFF4493-5482-465C-A02C-784435861343}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Release|Mixed Platforms.Build.0 = Release|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Release|x64.ActiveCfg = Release|x64 - {2CFF4493-5482-465C-A02C-784435861343}.Release|x64.Build.0 = Release|x64 - {2CFF4493-5482-465C-A02C-784435861343}.Release|x64.Deploy.0 = Release|x64 - {2CFF4493-5482-465C-A02C-784435861343}.Release|x86.ActiveCfg = Release|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Release|x86.Build.0 = Release|x86 - {2CFF4493-5482-465C-A02C-784435861343}.Release|x86.Deploy.0 = Release|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|ARM.ActiveCfg = Debug|ARM - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|ARM.Build.0 = Debug|ARM - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|ARM.Deploy.0 = Debug|ARM - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x64.ActiveCfg = Debug|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x86.ActiveCfg = Debug|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x86.Build.0 = Debug|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x86.Deploy.0 = Debug|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Any CPU.Build.0 = Release|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Any CPU.Deploy.0 = Release|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|ARM.ActiveCfg = Release|ARM - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|ARM.Build.0 = Release|ARM - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|ARM.Deploy.0 = Release|ARM - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Mixed Platforms.Build.0 = Release|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x64.ActiveCfg = Release|Any CPU - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x86.ActiveCfg = Release|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x86.Build.0 = Release|x86 - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x86.Deploy.0 = Release|x86 - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|ARM.ActiveCfg = Debug|ARM - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|ARM.Build.0 = Debug|ARM - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|x64.ActiveCfg = Debug|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|x86.ActiveCfg = Debug|x86 - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|x86.Build.0 = Debug|x86 - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Any CPU.Build.0 = Release|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|ARM.ActiveCfg = Release|ARM - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|ARM.Build.0 = Release|ARM - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|x64.ActiveCfg = Release|Any CPU - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|x86.ActiveCfg = Release|x86 - {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|x86.Build.0 = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Any CPU.ActiveCfg = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|ARM.ActiveCfg = Debug|ARM - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|ARM.Build.0 = Debug|ARM - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|ARM.Deploy.0 = Debug|ARM - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x64.ActiveCfg = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x86.ActiveCfg = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x86.Build.0 = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x86.Deploy.0 = Debug|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Any CPU.ActiveCfg = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|ARM.ActiveCfg = Release|ARM - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|ARM.Build.0 = Release|ARM - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|ARM.Deploy.0 = Release|ARM - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Mixed Platforms.Build.0 = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x64.ActiveCfg = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x86.ActiveCfg = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x86.Build.0 = Release|x86 - {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x86.Deploy.0 = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Any CPU.ActiveCfg = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|ARM.ActiveCfg = Debug|ARM - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|ARM.Build.0 = Debug|ARM - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|ARM.Deploy.0 = Debug|ARM - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x64.ActiveCfg = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x86.ActiveCfg = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x86.Build.0 = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x86.Deploy.0 = Debug|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Any CPU.ActiveCfg = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|ARM.ActiveCfg = Release|ARM - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|ARM.Build.0 = Release|ARM - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|ARM.Deploy.0 = Release|ARM - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Mixed Platforms.Build.0 = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x64.ActiveCfg = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x86.ActiveCfg = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x86.Build.0 = Release|x86 - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x86.Deploy.0 = Release|x86 - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|ARM.ActiveCfg = Debug|ARM - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|ARM.Build.0 = Debug|ARM - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|x64.ActiveCfg = Debug|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|x86.ActiveCfg = Debug|x86 - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|x86.Build.0 = Debug|x86 - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Any CPU.Build.0 = Release|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|ARM.ActiveCfg = Release|ARM - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|ARM.Build.0 = Release|ARM - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|x64.ActiveCfg = Release|Any CPU - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|x86.ActiveCfg = Release|x86 - {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|x86.Build.0 = Release|x86 - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|ARM.ActiveCfg = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|x64.ActiveCfg = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|x86.ActiveCfg = Debug|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Any CPU.Build.0 = Release|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|ARM.ActiveCfg = Release|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|x64.ActiveCfg = Release|Any CPU - {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|x86.ActiveCfg = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|ARM.ActiveCfg = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|x64.ActiveCfg = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|x86.ActiveCfg = Debug|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Any CPU.ActiveCfg = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Any CPU.Build.0 = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|ARM.ActiveCfg = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|x64.ActiveCfg = Release|Any CPU - {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|x86.ActiveCfg = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|ARM.ActiveCfg = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|x64.ActiveCfg = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|x86.ActiveCfg = Debug|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Any CPU.Build.0 = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|ARM.ActiveCfg = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|x64.ActiveCfg = Release|Any CPU - {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|x86.ActiveCfg = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|ARM.ActiveCfg = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|x64.ActiveCfg = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|x86.ActiveCfg = Debug|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Any CPU.Build.0 = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|ARM.ActiveCfg = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|x64.ActiveCfg = Release|Any CPU - {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|x86.ActiveCfg = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|ARM.ActiveCfg = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|x64.ActiveCfg = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|x86.ActiveCfg = Debug|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Any CPU.Build.0 = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|ARM.ActiveCfg = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|x64.ActiveCfg = Release|Any CPU - {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|x86.ActiveCfg = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|ARM.ActiveCfg = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|x64.ActiveCfg = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|x86.ActiveCfg = Debug|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Any CPU.Build.0 = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|ARM.ActiveCfg = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|x64.ActiveCfg = Release|Any CPU - {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|x86.ActiveCfg = Release|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|ARM.ActiveCfg = Debug|ARM - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|ARM.Build.0 = Debug|ARM - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|ARM.Deploy.0 = Debug|ARM - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x64.ActiveCfg = Debug|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x86.ActiveCfg = Debug|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x86.Build.0 = Debug|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x86.Deploy.0 = Debug|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Any CPU.Build.0 = Release|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Any CPU.Deploy.0 = Release|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|ARM.ActiveCfg = Release|ARM - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|ARM.Build.0 = Release|ARM - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|ARM.Deploy.0 = Release|ARM - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Mixed Platforms.Build.0 = Release|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x64.ActiveCfg = Release|Any CPU - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x86.ActiveCfg = Release|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x86.Build.0 = Release|x86 - {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x86.Deploy.0 = Release|x86 - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|ARM.ActiveCfg = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|x64.ActiveCfg = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|x86.ActiveCfg = Debug|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Any CPU.Build.0 = Release|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|ARM.ActiveCfg = Release|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|x64.ActiveCfg = Release|Any CPU - {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|x86.ActiveCfg = Release|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|ARM.ActiveCfg = Debug|ARM - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|ARM.Build.0 = Debug|ARM - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|ARM.Deploy.0 = Debug|ARM - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x64.ActiveCfg = Debug|x64 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x64.Build.0 = Debug|x64 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x64.Deploy.0 = Debug|x64 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x86.ActiveCfg = Debug|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x86.Build.0 = Debug|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x86.Deploy.0 = Debug|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Any CPU.Build.0 = Release|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Any CPU.Deploy.0 = Release|Any CPU - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|ARM.ActiveCfg = Release|ARM - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|ARM.Build.0 = Release|ARM - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|ARM.Deploy.0 = Release|ARM - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Mixed Platforms.Build.0 = Release|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x64.ActiveCfg = Release|x64 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x64.Build.0 = Release|x64 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x64.Deploy.0 = Release|x64 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x86.ActiveCfg = Release|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x86.Build.0 = Release|x86 - {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x86.Deploy.0 = Release|x86 - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|ARM.ActiveCfg = Debug|ARM - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|ARM.Build.0 = Debug|ARM - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|x64.ActiveCfg = Debug|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|x86.ActiveCfg = Debug|x86 - {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|x86.Build.0 = Debug|x86 - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Any CPU.Build.0 = Release|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|ARM.ActiveCfg = Release|ARM - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|ARM.Build.0 = Release|ARM - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|x64.ActiveCfg = Release|Any CPU - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|x86.ActiveCfg = Release|x86 - {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|x86.Build.0 = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Any CPU.ActiveCfg = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|ARM.ActiveCfg = Debug|ARM - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|ARM.Build.0 = Debug|ARM - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|ARM.Deploy.0 = Debug|ARM - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x64.ActiveCfg = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x86.ActiveCfg = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x86.Build.0 = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x86.Deploy.0 = Debug|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Any CPU.ActiveCfg = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|ARM.ActiveCfg = Release|ARM - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|ARM.Build.0 = Release|ARM - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|ARM.Deploy.0 = Release|ARM - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Mixed Platforms.Build.0 = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Mixed Platforms.Deploy.0 = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x64.ActiveCfg = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x86.ActiveCfg = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x86.Build.0 = Release|x86 - {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x86.Deploy.0 = Release|x86 - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|ARM.ActiveCfg = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|x64.ActiveCfg = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|x86.ActiveCfg = Debug|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Any CPU.Build.0 = Release|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|ARM.ActiveCfg = Release|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|x64.ActiveCfg = Release|Any CPU - {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|x86.ActiveCfg = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|ARM.ActiveCfg = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|x64.ActiveCfg = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|x86.ActiveCfg = Debug|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Any CPU.Build.0 = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|ARM.ActiveCfg = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|x64.ActiveCfg = Release|Any CPU - {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|x86.ActiveCfg = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|ARM.ActiveCfg = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|x64.ActiveCfg = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|x86.ActiveCfg = Debug|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Any CPU.Build.0 = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|ARM.ActiveCfg = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|x64.ActiveCfg = Release|Any CPU - {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|x86.ActiveCfg = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|ARM.ActiveCfg = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|x64.ActiveCfg = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|x86.ActiveCfg = Debug|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Any CPU.Build.0 = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|ARM.ActiveCfg = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|x64.ActiveCfg = Release|Any CPU - {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|x86.ActiveCfg = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|ARM.ActiveCfg = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|x64.ActiveCfg = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|x86.ActiveCfg = Debug|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Any CPU.Build.0 = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|ARM.ActiveCfg = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|x64.ActiveCfg = Release|Any CPU - {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|x86.ActiveCfg = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {59378F82-F92D-457E-8FB1-B7799A7A919B} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {AAE11955-7DF4-4758-9024-C5247BDE0368} = {B25F0638-578E-4E2A-9783-23EB99B525BE} - {2CFF4493-5482-465C-A02C-784435861343} = {B25F0638-578E-4E2A-9783-23EB99B525BE} - {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6} = {B25F0638-578E-4E2A-9783-23EB99B525BE} - {29B2A5BA-2E0A-484A-866D-41CCE7144521} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {B59BBF25-4D29-4B1F-AB02-588AC4032E9E} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {30EFC165-77CE-4AC3-B99B-7998D5E39749} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {0F66F445-5DF0-4064-8214-3D16FF924E88} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {E924C358-8AFD-4B47-903D-5760221AA05C} = {B25F0638-578E-4E2A-9783-23EB99B525BE} - {DB6CF16F-315E-4BBD-8348-369905645838} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {3620804D-B56B-4C22-B987-AAD7B7F40FC8} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - {0E24C663-BDCB-4702-864B-A850A9C68F03} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} - EndGlobalSection -EndGlobal diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2015).sln b/GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2015).sln new file mode 100644 index 0000000..f26c48f --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight (VS2015).sln @@ -0,0 +1,1668 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (PCL)", "GalaSoft.MvvmLight (PCL)\GalaSoft.MvvmLight (PCL).csproj", "{6A912701-3BA1-4975-ADBF-160CAF66B640}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PNET45)", "Tests\PCL\GalaSoft.MvvmLight.Test (PNET45)\GalaSoft.MvvmLight.Test (PNET45).csproj", "{59378F82-F92D-457E-8FB1-B7799A7A919B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestViews", "TestViews", "{B25F0638-578E-4E2A-9783-23EB99B525BE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PNET45)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PNET45)\GalaSoft.MvvmLight.TestView (PNET45).csproj", "{AAE11955-7DF4-4758-9024-C5247BDE0368}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{99D5856E-95ED-49B6-9F0C-0A5878A87009}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (NET45)", "GalaSoft.MvvmLight.Platform (NET45)\GalaSoft.MvvmLight.Platform (NET45).csproj", "{0722B3DB-76CD-4562-BEA9-5C5C416B6A39}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WIN81)", "GalaSoft.MvvmLight.Platform (WIN81)\GalaSoft.MvvmLight.Platform (WIN81).csproj", "{8E1FCE57-FD06-44ED-B2BC-6D935329630E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PWIN81)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PWIN81)\GalaSoft.MvvmLight.TestView (PWIN81).csproj", "{2CFF4493-5482-465C-A02C-784435861343}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PWPSL81)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PWPSL81)\GalaSoft.MvvmLight.TestView (PWPSL81).csproj", "{BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WPSL81)", "GalaSoft.MvvmLight.Platform (WPSL81)\GalaSoft.MvvmLight.Platform (WPSL81).csproj", "{588595A3-48D5-4A2C-930A-59C5123A07CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWPSL81)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWPSL81)\GalaSoft.MvvmLight.Test (PWPSL81).csproj", "{29B2A5BA-2E0A-484A-866D-41CCE7144521}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWP81)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWP81)\GalaSoft.MvvmLight.Test (PWP81).csproj", "{B59BBF25-4D29-4B1F-AB02-588AC4032E9E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WP81)", "GalaSoft.MvvmLight.Platform (WP81)\GalaSoft.MvvmLight.Platform (WP81).csproj", "{0A0F720A-2A59-4276-93BC-B4BBEC2D187F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (NET4)", "GalaSoft.MvvmLight (NET4)\GalaSoft.MvvmLight (NET4).csproj", "{36A3299E-5BC9-46D1-8A8F-9D85E3B58529}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (NET4)", "Tests\GalaSoft.MvvmLight.Test (NET4)\GalaSoft.MvvmLight.Test (NET4).csproj", "{30EFC165-77CE-4AC3-B99B-7998D5E39749}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (NET4)", "GalaSoft.MvvmLight.Extras (NET4)\GalaSoft.MvvmLight.Extras (NET4).csproj", "{DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (NET35)", "GalaSoft.MvvmLight (NET35)\GalaSoft.MvvmLight (NET35).csproj", "{80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (NET35)", "GalaSoft.MvvmLight.Extras (NET35)\GalaSoft.MvvmLight.Extras (NET35).csproj", "{B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (NET35)", "Tests\GalaSoft.MvvmLight.Test (NET35)\GalaSoft.MvvmLight.Test (NET35).csproj", "{0F66F445-5DF0-4064-8214-3D16FF924E88}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.TestView (PWP81)", "TestViews\PCL\GalaSoft.MvvmLight.TestView (PWP81)\GalaSoft.MvvmLight.TestView (PWP81).csproj", "{E924C358-8AFD-4B47-903D-5760221AA05C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (PCL)", "GalaSoft.MvvmLight.Extras (PCL)\GalaSoft.MvvmLight.Extras (PCL).csproj", "{39C71A69-4ACE-4B45-9A2C-C274FADA78EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWIN81)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWIN81)\GalaSoft.MvvmLight.Test (PWIN81).csproj", "{DB6CF16F-315E-4BBD-8348-369905645838}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (WPSL80)", "GalaSoft.MvvmLight.Platform (WPSL80)\GalaSoft.MvvmLight.Platform (WPSL80).csproj", "{5E668BEC-ADF7-4F85-AC28-685863160494}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (PWPSL80)", "Tests\PCL\GalaSoft.MvvmLight.Test (PWPSL80)\GalaSoft.MvvmLight.Test (PWPSL80).csproj", "{3620804D-B56B-4C22-B987-AAD7B7F40FC8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (Android)", "GalaSoft.MvvmLight.Platform (Android)\GalaSoft.MvvmLight.Platform (Android).csproj", "{A5B7741D-E331-438C-B3BF-596B048DB622}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight (SL5)", "GalaSoft.MvvmLight (SL5)\GalaSoft.MvvmLight (SL5).csproj", "{4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Extras (SL5)", "GalaSoft.MvvmLight.Extras (SL5)\GalaSoft.MvvmLight.Extras (SL5).csproj", "{F0428C63-C7AD-4563-AC05-81EAA4D76D28}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (SL5)", "Tests\GalaSoft.MvvmLight.Test (SL5)\GalaSoft.MvvmLight.Test (SL5).csproj", "{0E24C663-BDCB-4702-864B-A850A9C68F03}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Platform (iOS)", "GalaSoft.MvvmLight.Platform (iOS)\GalaSoft.MvvmLight.Platform (iOS).csproj", "{DE2FB1EC-A248-4980-A5E3-6835231D84CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (Android)", "Tests\AndroidTestApp\GalaSoft.MvvmLight.Test (Android).csproj", "{7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GalaSoft.MvvmLight.Test (iOS)", "Tests\AppleTestApp\GalaSoft.MvvmLight.Test (iOS).csproj", "{D688119A-4FA8-4764-BE47-90724571B80C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Ad-Hoc|Any CPU = Ad-Hoc|Any CPU + Ad-Hoc|ARM = Ad-Hoc|ARM + Ad-Hoc|iPhone = Ad-Hoc|iPhone + Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator + Ad-Hoc|Mixed Platforms = Ad-Hoc|Mixed Platforms + Ad-Hoc|x64 = Ad-Hoc|x64 + Ad-Hoc|x86 = Ad-Hoc|x86 + AppStore|Any CPU = AppStore|Any CPU + AppStore|ARM = AppStore|ARM + AppStore|iPhone = AppStore|iPhone + AppStore|iPhoneSimulator = AppStore|iPhoneSimulator + AppStore|Mixed Platforms = AppStore|Mixed Platforms + AppStore|x64 = AppStore|x64 + AppStore|x86 = AppStore|x86 + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|iPhone = Debug|iPhone + Debug|iPhoneSimulator = Debug|iPhoneSimulator + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|iPhone = Release|iPhone + Release|iPhoneSimulator = Release|iPhoneSimulator + Release|Mixed Platforms = Release|Mixed Platforms + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|Any CPU.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|ARM.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|ARM.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|iPhone.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|x64.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|x64.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|x86.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.AppStore|x86.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|ARM.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|iPhone.Build.0 = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|x64.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Debug|x86.ActiveCfg = Debug|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Any CPU.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|ARM.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|iPhone.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|iPhone.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|x64.ActiveCfg = Release|Any CPU + {6A912701-3BA1-4975-ADBF-160CAF66B640}.Release|x86.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|Any CPU.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|ARM.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|ARM.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|iPhone.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|x64.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|x64.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|x86.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.AppStore|x86.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|ARM.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|iPhone.Build.0 = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|x64.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Debug|x86.ActiveCfg = Debug|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Any CPU.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|ARM.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|iPhone.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|iPhone.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|x64.ActiveCfg = Release|Any CPU + {59378F82-F92D-457E-8FB1-B7799A7A919B}.Release|x86.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|ARM.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|x64.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.AppStore|x86.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|ARM.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|x64.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Debug|x86.ActiveCfg = Debug|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Any CPU.Build.0 = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|ARM.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|iPhone.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|x64.ActiveCfg = Release|Any CPU + {AAE11955-7DF4-4758-9024-C5247BDE0368}.Release|x86.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|Any CPU.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|ARM.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|ARM.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|iPhone.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|x64.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|x64.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|x86.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.AppStore|x86.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|iPhone.Build.0 = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|x64.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Debug|x86.ActiveCfg = Debug|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Any CPU.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|ARM.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|iPhone.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|iPhone.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|x64.ActiveCfg = Release|Any CPU + {0722B3DB-76CD-4562-BEA9-5C5C416B6A39}.Release|x86.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|ARM.Build.0 = Release|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|x64.ActiveCfg = Release|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|x64.Build.0 = Release|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Ad-Hoc|x86.Build.0 = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|Any CPU.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|ARM.ActiveCfg = Release|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|ARM.Build.0 = Release|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|iPhone.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|x64.ActiveCfg = Release|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|x64.Build.0 = Release|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|x86.ActiveCfg = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.AppStore|x86.Build.0 = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|ARM.ActiveCfg = Debug|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|ARM.Build.0 = Debug|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|iPhone.Build.0 = Debug|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x64.ActiveCfg = Debug|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x64.Build.0 = Debug|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x86.ActiveCfg = Debug|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Debug|x86.Build.0 = Debug|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Any CPU.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|ARM.ActiveCfg = Release|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|ARM.Build.0 = Release|ARM + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|iPhone.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|iPhone.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x64.ActiveCfg = Release|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x64.Build.0 = Release|x64 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x86.ActiveCfg = Release|x86 + {8E1FCE57-FD06-44ED-B2BC-6D935329630E}.Release|x86.Build.0 = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|x64.ActiveCfg = Release|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|ARM.ActiveCfg = Release|ARM + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|x64.ActiveCfg = Release|x64 + {2CFF4493-5482-465C-A02C-784435861343}.AppStore|x86.ActiveCfg = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Debug|ARM.ActiveCfg = Debug|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Debug|ARM.Build.0 = Debug|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Debug|ARM.Deploy.0 = Debug|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|x64.ActiveCfg = Debug|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|x64.Build.0 = Debug|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|x64.Deploy.0 = Debug|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|x86.ActiveCfg = Debug|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|x86.Build.0 = Debug|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Debug|x86.Deploy.0 = Debug|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Release|Any CPU.Build.0 = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Release|Any CPU.Deploy.0 = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Release|ARM.ActiveCfg = Release|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Release|ARM.Build.0 = Release|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Release|ARM.Deploy.0 = Release|ARM + {2CFF4493-5482-465C-A02C-784435861343}.Release|iPhone.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {2CFF4493-5482-465C-A02C-784435861343}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Release|Mixed Platforms.Build.0 = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Release|x64.ActiveCfg = Release|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Release|x64.Build.0 = Release|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Release|x64.Deploy.0 = Release|x64 + {2CFF4493-5482-465C-A02C-784435861343}.Release|x86.ActiveCfg = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Release|x86.Build.0 = Release|x86 + {2CFF4493-5482-465C-A02C-784435861343}.Release|x86.Deploy.0 = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|ARM.ActiveCfg = Release|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|x64.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.AppStore|x86.ActiveCfg = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|ARM.ActiveCfg = Debug|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|ARM.Build.0 = Debug|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|ARM.Deploy.0 = Debug|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x86.ActiveCfg = Debug|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x86.Build.0 = Debug|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Debug|x86.Deploy.0 = Debug|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Any CPU.Build.0 = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Any CPU.Deploy.0 = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|ARM.ActiveCfg = Release|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|ARM.Build.0 = Release|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|ARM.Deploy.0 = Release|ARM + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|iPhone.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Mixed Platforms.Build.0 = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x64.ActiveCfg = Release|Any CPU + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x86.ActiveCfg = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x86.Build.0 = Release|x86 + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6}.Release|x86.Deploy.0 = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|ARM.Build.0 = Release|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Ad-Hoc|x86.Build.0 = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|Any CPU.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|ARM.ActiveCfg = Release|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|ARM.Build.0 = Release|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|iPhone.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|x64.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|x64.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|x86.ActiveCfg = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.AppStore|x86.Build.0 = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|ARM.ActiveCfg = Debug|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|ARM.Build.0 = Debug|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|iPhone.Build.0 = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|x64.ActiveCfg = Debug|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|x86.ActiveCfg = Debug|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Debug|x86.Build.0 = Debug|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Any CPU.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|ARM.ActiveCfg = Release|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|ARM.Build.0 = Release|ARM + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|iPhone.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|iPhone.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|x64.ActiveCfg = Release|Any CPU + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|x86.ActiveCfg = Release|x86 + {588595A3-48D5-4A2C-930A-59C5123A07CD}.Release|x86.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|Any CPU.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|Any CPU.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|Any CPU.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|ARM.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|ARM.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|iPhone.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|iPhone.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|iPhone.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|x64.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|x64.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|x64.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|x86.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Ad-Hoc|x86.Deploy.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|Any CPU.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|Any CPU.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|Any CPU.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|ARM.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|ARM.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|ARM.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|iPhone.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|iPhone.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|iPhone.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|iPhoneSimulator.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|iPhoneSimulator.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|iPhoneSimulator.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|Mixed Platforms.Deploy.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|x64.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|x64.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|x64.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|x86.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|x86.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.AppStore|x86.Deploy.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Any CPU.ActiveCfg = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|ARM.ActiveCfg = Debug|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|ARM.Build.0 = Debug|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|ARM.Deploy.0 = Debug|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|iPhone.ActiveCfg = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x64.ActiveCfg = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x86.ActiveCfg = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x86.Build.0 = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Debug|x86.Deploy.0 = Debug|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Any CPU.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|ARM.ActiveCfg = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|ARM.Build.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|ARM.Deploy.0 = Release|ARM + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|iPhone.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|iPhoneSimulator.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Mixed Platforms.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x64.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x86.ActiveCfg = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x86.Build.0 = Release|x86 + {29B2A5BA-2E0A-484A-866D-41CCE7144521}.Release|x86.Deploy.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|Any CPU.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|Any CPU.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|Any CPU.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|ARM.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|ARM.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|iPhone.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|iPhone.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|iPhone.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|x64.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|x64.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|x64.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|x86.Build.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Ad-Hoc|x86.Deploy.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|Any CPU.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|Any CPU.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|Any CPU.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|ARM.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|ARM.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|ARM.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|iPhone.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|iPhone.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|iPhone.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|iPhoneSimulator.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|iPhoneSimulator.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|iPhoneSimulator.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|Mixed Platforms.Deploy.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|x64.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|x64.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|x64.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|x86.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|x86.Build.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.AppStore|x86.Deploy.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Any CPU.ActiveCfg = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|ARM.ActiveCfg = Debug|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|ARM.Build.0 = Debug|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|ARM.Deploy.0 = Debug|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|iPhone.ActiveCfg = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x64.ActiveCfg = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x86.ActiveCfg = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x86.Build.0 = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Debug|x86.Deploy.0 = Debug|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Any CPU.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|ARM.ActiveCfg = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|ARM.Build.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|ARM.Deploy.0 = Release|ARM + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|iPhone.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|iPhoneSimulator.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Mixed Platforms.Build.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x64.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x86.ActiveCfg = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x86.Build.0 = Release|x86 + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E}.Release|x86.Deploy.0 = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|ARM.Build.0 = Release|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Ad-Hoc|x86.Build.0 = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|Any CPU.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|ARM.ActiveCfg = Release|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|ARM.Build.0 = Release|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|iPhone.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|x64.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|x64.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|x86.ActiveCfg = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.AppStore|x86.Build.0 = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|ARM.ActiveCfg = Debug|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|ARM.Build.0 = Debug|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|iPhone.Build.0 = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|x64.ActiveCfg = Debug|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|x86.ActiveCfg = Debug|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Debug|x86.Build.0 = Debug|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Any CPU.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|ARM.ActiveCfg = Release|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|ARM.Build.0 = Release|ARM + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|iPhone.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|iPhone.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|x64.ActiveCfg = Release|Any CPU + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|x86.ActiveCfg = Release|x86 + {0A0F720A-2A59-4276-93BC-B4BBEC2D187F}.Release|x86.Build.0 = Release|x86 + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|Any CPU.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|ARM.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|ARM.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|iPhone.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|x64.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|x64.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|x86.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.AppStore|x86.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|ARM.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|iPhone.Build.0 = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|x64.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Debug|x86.ActiveCfg = Debug|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Any CPU.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|ARM.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|iPhone.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|iPhone.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|x64.ActiveCfg = Release|Any CPU + {36A3299E-5BC9-46D1-8A8F-9D85E3B58529}.Release|x86.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|Any CPU.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|ARM.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|ARM.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|iPhone.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|x64.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|x64.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|x86.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.AppStore|x86.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|ARM.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|iPhone.Build.0 = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|x64.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Debug|x86.ActiveCfg = Debug|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Any CPU.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|ARM.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|iPhone.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|iPhone.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|x64.ActiveCfg = Release|Any CPU + {30EFC165-77CE-4AC3-B99B-7998D5E39749}.Release|x86.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|Any CPU.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|ARM.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|ARM.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|iPhone.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|x64.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|x64.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|x86.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.AppStore|x86.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|ARM.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|iPhone.Build.0 = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|x64.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Debug|x86.ActiveCfg = Debug|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Any CPU.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|ARM.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|iPhone.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|iPhone.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|x64.ActiveCfg = Release|Any CPU + {DEE82CB5-7C8C-4E00-8F8A-1CC48E033943}.Release|x86.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|Any CPU.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|ARM.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|ARM.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|iPhone.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|x64.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|x64.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|x86.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.AppStore|x86.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|iPhone.Build.0 = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|x64.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Any CPU.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|ARM.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|iPhone.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|iPhone.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|x64.ActiveCfg = Release|Any CPU + {80BFFA86-0EFF-4B5A-BA81-02EC6B681BE2}.Release|x86.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|Any CPU.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|ARM.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|ARM.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|iPhone.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|x64.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|x64.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|x86.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.AppStore|x86.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|iPhone.Build.0 = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Debug|x86.ActiveCfg = Debug|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Any CPU.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|ARM.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|iPhone.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|iPhone.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|x64.ActiveCfg = Release|Any CPU + {B7D2A691-4C0E-4C54-AB1C-1B79559E0B0A}.Release|x86.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|Any CPU.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|ARM.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|ARM.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|iPhone.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|x64.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|x64.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|x86.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.AppStore|x86.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|iPhone.Build.0 = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Debug|x86.ActiveCfg = Debug|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Any CPU.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|ARM.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|iPhone.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|iPhone.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|x64.ActiveCfg = Release|Any CPU + {0F66F445-5DF0-4064-8214-3D16FF924E88}.Release|x86.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|ARM.ActiveCfg = Release|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|x64.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.AppStore|x86.ActiveCfg = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|ARM.ActiveCfg = Debug|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|ARM.Build.0 = Debug|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|ARM.Deploy.0 = Debug|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x64.ActiveCfg = Debug|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x86.ActiveCfg = Debug|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x86.Build.0 = Debug|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Debug|x86.Deploy.0 = Debug|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Any CPU.Build.0 = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Any CPU.Deploy.0 = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|ARM.ActiveCfg = Release|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|ARM.Build.0 = Release|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|ARM.Deploy.0 = Release|ARM + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|iPhone.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Mixed Platforms.Build.0 = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x64.ActiveCfg = Release|Any CPU + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x86.ActiveCfg = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x86.Build.0 = Release|x86 + {E924C358-8AFD-4B47-903D-5760221AA05C}.Release|x86.Deploy.0 = Release|x86 + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|Any CPU.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|ARM.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|ARM.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|iPhone.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|x64.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|x64.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|x86.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.AppStore|x86.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|ARM.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|iPhone.Build.0 = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Any CPU.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|ARM.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|iPhone.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|iPhone.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|x64.ActiveCfg = Release|Any CPU + {39C71A69-4ACE-4B45-9A2C-C274FADA78EF}.Release|x86.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|ARM.Build.0 = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|ARM.Deploy.0 = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|x64.ActiveCfg = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|x64.Build.0 = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|x64.Deploy.0 = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|x86.Build.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Ad-Hoc|x86.Deploy.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|Any CPU.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|Any CPU.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|ARM.ActiveCfg = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|ARM.Build.0 = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|ARM.Deploy.0 = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|iPhone.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|iPhone.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|Mixed Platforms.Deploy.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|x64.ActiveCfg = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|x64.Build.0 = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|x64.Deploy.0 = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|x86.ActiveCfg = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|x86.Build.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.AppStore|x86.Deploy.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|ARM.ActiveCfg = Debug|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|ARM.Build.0 = Debug|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|ARM.Deploy.0 = Debug|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|iPhone.Build.0 = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|iPhone.Deploy.0 = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x64.ActiveCfg = Debug|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x64.Build.0 = Debug|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x64.Deploy.0 = Debug|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x86.ActiveCfg = Debug|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x86.Build.0 = Debug|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Debug|x86.Deploy.0 = Debug|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Any CPU.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Any CPU.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|ARM.ActiveCfg = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|ARM.Build.0 = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|ARM.Deploy.0 = Release|ARM + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|iPhone.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|iPhone.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|iPhone.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Mixed Platforms.Build.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x64.ActiveCfg = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x64.Build.0 = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x64.Deploy.0 = Release|x64 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x86.ActiveCfg = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x86.Build.0 = Release|x86 + {DB6CF16F-315E-4BBD-8348-369905645838}.Release|x86.Deploy.0 = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|ARM.Build.0 = Release|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Ad-Hoc|x86.Build.0 = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|Any CPU.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|ARM.ActiveCfg = Release|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|ARM.Build.0 = Release|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|iPhone.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|x64.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|x64.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|x86.ActiveCfg = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.AppStore|x86.Build.0 = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|ARM.ActiveCfg = Debug|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|ARM.Build.0 = Debug|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|iPhone.Build.0 = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|x64.ActiveCfg = Debug|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|x86.ActiveCfg = Debug|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Debug|x86.Build.0 = Debug|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Any CPU.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|ARM.ActiveCfg = Release|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|ARM.Build.0 = Release|ARM + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|iPhone.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|iPhone.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|x64.ActiveCfg = Release|Any CPU + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|x86.ActiveCfg = Release|x86 + {5E668BEC-ADF7-4F85-AC28-685863160494}.Release|x86.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|Any CPU.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|Any CPU.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|Any CPU.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|ARM.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|ARM.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|iPhone.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|iPhone.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|iPhone.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|x64.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|x64.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|x64.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|x86.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Ad-Hoc|x86.Deploy.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|Any CPU.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|Any CPU.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|Any CPU.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|ARM.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|ARM.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|ARM.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|iPhone.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|iPhone.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|iPhone.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|iPhoneSimulator.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|iPhoneSimulator.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|iPhoneSimulator.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|Mixed Platforms.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|Mixed Platforms.Deploy.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|x64.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|x64.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|x64.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|x86.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|x86.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.AppStore|x86.Deploy.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Any CPU.ActiveCfg = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|ARM.ActiveCfg = Debug|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|ARM.Build.0 = Debug|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|ARM.Deploy.0 = Debug|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|iPhone.ActiveCfg = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|Mixed Platforms.Deploy.0 = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x64.ActiveCfg = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x86.ActiveCfg = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x86.Build.0 = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Debug|x86.Deploy.0 = Debug|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Any CPU.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|ARM.ActiveCfg = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|ARM.Build.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|ARM.Deploy.0 = Release|ARM + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|iPhone.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|iPhoneSimulator.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Mixed Platforms.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|Mixed Platforms.Deploy.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x64.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x86.ActiveCfg = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x86.Build.0 = Release|x86 + {3620804D-B56B-4C22-B987-AAD7B7F40FC8}.Release|x86.Deploy.0 = Release|x86 + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|Any CPU.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|ARM.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|ARM.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|iPhone.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|x64.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|x64.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|x86.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.AppStore|x86.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|ARM.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|iPhone.Build.0 = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Debug|x86.ActiveCfg = Debug|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Any CPU.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|ARM.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|iPhone.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|iPhone.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|x64.ActiveCfg = Release|Any CPU + {A5B7741D-E331-438C-B3BF-596B048DB622}.Release|x86.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|Any CPU.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|ARM.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|ARM.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|iPhone.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|x64.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|x64.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|x86.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.AppStore|x86.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|iPhone.Build.0 = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|x64.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Debug|x86.ActiveCfg = Debug|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Any CPU.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|ARM.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|iPhone.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|iPhone.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|x64.ActiveCfg = Release|Any CPU + {4A3E7910-7169-4462-B9E4-E7DF8BE6B09E}.Release|x86.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|Any CPU.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|ARM.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|ARM.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|iPhone.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|x64.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|x64.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|x86.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.AppStore|x86.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|ARM.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|iPhone.Build.0 = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|x64.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Debug|x86.ActiveCfg = Debug|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Any CPU.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|ARM.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|iPhone.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|iPhone.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|x64.ActiveCfg = Release|Any CPU + {F0428C63-C7AD-4563-AC05-81EAA4D76D28}.Release|x86.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|Any CPU.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|ARM.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|ARM.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|iPhone.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|x64.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|x64.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|x86.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.AppStore|x86.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|iPhone.Build.0 = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|x64.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Debug|x86.ActiveCfg = Debug|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Any CPU.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|ARM.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|iPhone.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|iPhone.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|x64.ActiveCfg = Release|Any CPU + {0E24C663-BDCB-4702-864B-A850A9C68F03}.Release|x86.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|Any CPU.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|ARM.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|ARM.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|iPhone.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|x64.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|x64.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|x86.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.AppStore|x86.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|iPhone.Build.0 = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|x64.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Debug|x86.ActiveCfg = Debug|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Any CPU.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|ARM.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|iPhone.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|iPhone.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|x64.ActiveCfg = Release|Any CPU + {DE2FB1EC-A248-4980-A5E3-6835231D84CD}.Release|x86.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|Any CPU.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|Any CPU.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|ARM.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|ARM.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|ARM.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|iPhone.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|iPhone.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|Mixed Platforms.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|x64.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|x64.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|x64.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|x86.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|x86.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.AppStore|x86.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|ARM.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|ARM.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|ARM.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|iPhone.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|iPhone.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|x64.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|x64.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|x64.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|x86.ActiveCfg = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|x86.Build.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Debug|x86.Deploy.0 = Debug|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|Any CPU.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|Any CPU.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|ARM.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|ARM.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|ARM.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|iPhone.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|iPhone.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|iPhone.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|Mixed Platforms.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|x64.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|x64.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|x64.Deploy.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|x86.ActiveCfg = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|x86.Build.0 = Release|Any CPU + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA}.Release|x86.Deploy.0 = Release|Any CPU + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|Mixed Platforms.ActiveCfg = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|Mixed Platforms.Build.0 = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|ARM.ActiveCfg = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|iPhone.ActiveCfg = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|iPhone.Build.0 = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|Mixed Platforms.ActiveCfg = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|Mixed Platforms.Build.0 = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|x64.ActiveCfg = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.AppStore|x86.ActiveCfg = AppStore|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|Any CPU.ActiveCfg = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|ARM.ActiveCfg = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|iPhone.ActiveCfg = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|iPhone.Build.0 = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|Mixed Platforms.ActiveCfg = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|Mixed Platforms.Build.0 = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|x64.ActiveCfg = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Debug|x86.ActiveCfg = Debug|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|Any CPU.ActiveCfg = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|ARM.ActiveCfg = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|iPhone.ActiveCfg = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|iPhone.Build.0 = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|Mixed Platforms.ActiveCfg = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|Mixed Platforms.Build.0 = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|x64.ActiveCfg = Release|iPhone + {D688119A-4FA8-4764-BE47-90724571B80C}.Release|x86.ActiveCfg = Release|iPhone + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {59378F82-F92D-457E-8FB1-B7799A7A919B} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {AAE11955-7DF4-4758-9024-C5247BDE0368} = {B25F0638-578E-4E2A-9783-23EB99B525BE} + {2CFF4493-5482-465C-A02C-784435861343} = {B25F0638-578E-4E2A-9783-23EB99B525BE} + {BEC455D1-BA26-43FB-AC1A-C61FCB55DCC6} = {B25F0638-578E-4E2A-9783-23EB99B525BE} + {29B2A5BA-2E0A-484A-866D-41CCE7144521} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {B59BBF25-4D29-4B1F-AB02-588AC4032E9E} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {30EFC165-77CE-4AC3-B99B-7998D5E39749} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {0F66F445-5DF0-4064-8214-3D16FF924E88} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {E924C358-8AFD-4B47-903D-5760221AA05C} = {B25F0638-578E-4E2A-9783-23EB99B525BE} + {DB6CF16F-315E-4BBD-8348-369905645838} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {3620804D-B56B-4C22-B987-AAD7B7F40FC8} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {0E24C663-BDCB-4702-864B-A850A9C68F03} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + {D688119A-4FA8-4764-BE47-90724571B80C} = {99D5856E-95ED-49B6-9F0C-0A5878A87009} + EndGlobalSection +EndGlobal diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/GalaSoft.MvvmLight.Platform (Android).csproj b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/GalaSoft.MvvmLight.Platform (Android).csproj index 9f72772..cac8b9d 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/GalaSoft.MvvmLight.Platform (Android).csproj +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/GalaSoft.MvvmLight.Platform (Android).csproj @@ -53,8 +53,12 @@ Properties\AssemblyInfo.cs + + + + diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Binding.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Binding.cs index f82f17c..bddd5b6 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Binding.cs +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Binding.cs @@ -38,11 +38,6 @@ namespace GalaSoft.MvvmLight.Helpers /// protected WeakReference TopTarget; - /// - /// Occurs when the value of the databound property changes. - /// - public abstract event EventHandler ValueChanged; - /// /// The mode of the binding. OneTime means that the target property will be set once (when the binding is /// created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and @@ -99,5 +94,10 @@ namespace GalaSoft.MvvmLight.Helpers /// be set to the target value. /// public abstract void ForceUpdateValueFromTargetToSource(); + + /// + /// Occurs when the value of the databound property changes. + /// + public abstract event EventHandler ValueChanged; } } \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGeneric.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGeneric.cs index 935b05f..dc79832 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGeneric.cs +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGeneric.cs @@ -20,11 +20,6 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Windows; -#if ANDROID -using Android.Views; -using Android.Text; -using Android.Widget; -#endif namespace GalaSoft.MvvmLight.Helpers { @@ -40,7 +35,7 @@ namespace GalaSoft.MvvmLight.Helpers /// simple types can be converted. For more complex conversions, use the /// and methods to define custom converters. ////[ClassInfo(typeof(Binding))] - public class Binding : Binding + public partial class Binding : Binding { private readonly SimpleConverter _converter = new SimpleConverter(); private readonly List _listeners = new List(); @@ -50,6 +45,7 @@ namespace GalaSoft.MvvmLight.Helpers private readonly Dictionary _targetHandlers = new Dictionary(); private readonly Expression> _targetPropertyExpression; private readonly string _targetPropertyName; + private bool _isFallbackValueActive; private WeakAction _onSourceUpdate; private WeakReference _propertySource; private WeakReference _propertyTarget; @@ -59,9 +55,23 @@ namespace GalaSoft.MvvmLight.Helpers private PropertyInfo _targetProperty; /// - /// Occurs when the value of the databound property changes. + /// Gets or sets the value to use when the binding is unable to return a value. This can happen if one of the + /// items on the Path (except the source property itself) is null, or if the Converter throws an exception. /// - public override event EventHandler ValueChanged; + public TSource FallbackValue + { + get; + private set; + } + + /// + /// Gets of sets the value used when the source property is null (or equals to default(TSource)). + /// + public TSource TargetNullValue + { + get; + private set; + } /// /// Gets the current value of the binding. @@ -97,14 +107,22 @@ namespace GalaSoft.MvvmLight.Helpers /// if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source /// property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source /// implements INPC, and TwoWay if both the source and the target implement INPC. + /// Tthe value to use when the binding is unable to return a value. This can happen if one of the + /// items on the Path (except the source property itself) is null, or if the Converter throws an exception. + /// The value to use when the binding is unable to return a value. This can happen if one of the + /// items on the Path (except the source property itself) is null, or if the Converter throws an exception. public Binding( object source, string sourcePropertyName, object target = null, string targetPropertyName = null, - BindingMode mode = BindingMode.Default) + BindingMode mode = BindingMode.Default, + TSource fallbackValue = default(TSource), + TSource targetNullValue = default(TSource)) { Mode = mode; + FallbackValue = fallbackValue; + TargetNullValue = targetNullValue; TopSource = new WeakReference(source); _propertySource = new WeakReference(source); @@ -142,14 +160,22 @@ namespace GalaSoft.MvvmLight.Helpers /// if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source /// property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source /// implements INPC, and TwoWay if both the source and the target implement INPC. + /// Tthe value to use when the binding is unable to return a value. This can happen if one of the + /// items on the Path (except the source property itself) is null, or if the Converter throws an exception. + /// The value to use when the binding is unable to return a value. This can happen if one of the + /// items on the Path (except the source property itself) is null, or if the Converter throws an exception. public Binding( object source, Expression> sourcePropertyExpression, object target = null, Expression> targetPropertyExpression = null, - BindingMode mode = BindingMode.Default) + BindingMode mode = BindingMode.Default, + TSource fallbackValue = default(TSource), + TSource targetNullValue = default(TSource)) { Mode = mode; + FallbackValue = fallbackValue; + TargetNullValue = targetNullValue; TopSource = new WeakReference(source); _sourcePropertyExpression = sourcePropertyExpression; @@ -233,14 +259,26 @@ namespace GalaSoft.MvvmLight.Helpers if (_targetProperty != null) { - var value = GetSourceValue(); - var targetValue = _targetProperty.GetValue(_propertyTarget.Target); - - if (!Equals(value, targetValue)) + try { - _settingSourceToTarget = true; - _targetProperty.SetValue(_propertyTarget.Target, value, null); - _settingSourceToTarget = false; + var value = GetSourceValue(); + var targetValue = _targetProperty.GetValue(_propertyTarget.Target); + + if (!Equals(value, targetValue)) + { + _settingSourceToTarget = true; + SetTargetValue(value); + _settingSourceToTarget = false; + } + } + catch + { + if (!Equals(FallbackValue, default(TSource))) + { + _settingSourceToTarget = true; + _targetProperty.SetValue(_propertyTarget.Target, FallbackValue, null); + _settingSourceToTarget = false; + } } } @@ -277,7 +315,7 @@ namespace GalaSoft.MvvmLight.Helpers if (!Equals(value, sourceValue)) { _settingTargetToSource = true; - _sourceProperty.SetValue(_propertySource.Target, value, null); + SetSourceValue(value); _settingTargetToSource = false; } } @@ -302,7 +340,7 @@ namespace GalaSoft.MvvmLight.Helpers /// or is an empty string. /// When the requested event does not exist on the /// source control. - public Binding UpdateSourceTrigger(string eventName) + public Binding ObserveSourceEvent(string eventName) { if (string.IsNullOrEmpty(eventName)) { @@ -336,7 +374,6 @@ namespace GalaSoft.MvvmLight.Helpers "eventName"); } - // TODO Do we need weak events here? EventHandler handler = HandleSourceEvent; var defaultHandlerInfo = _sourceHandlers.Values.FirstOrDefault(i => i.IsDefault); @@ -367,106 +404,6 @@ namespace GalaSoft.MvvmLight.Helpers return this; } -#if IOS - /// - /// Define that the binding should be evaluated when the bound control's source property changes. - /// Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to specify that the binding must be updated when the property changes. - /// - /// At this point, this method is inactive on iOS. Use - /// instead. - /// The Binding instance. - /// When this method is called - /// on a OneTime binding. Such bindings cannot be updated. This exception can - /// also be thrown when the source object is null or has already been - /// garbage collected before this method is called. -#endif -#if ANDROID - /// - /// Define that the binding should be evaluated when the bound control's source property changes. - /// Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to specify that the binding must be updated when the property changes. - /// - /// This method should only be used with the following items: - /// - an EditText control and its Text property (TextChanged event). - /// - a CompoundButton control and its Checked property (CheckedChange event). - /// - /// The Binding instance. - /// When this method is called - /// on a OneTime binding. Such bindings cannot be updated. This exception can - /// also be thrown when the source object is null or has already been - /// garbage collected before this method is called. -#endif - public Binding UpdateSourceTrigger() - { - return UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); - } - -#if IOS - /// - /// Define when the binding should be evaluated when the bound source object - /// is a control. Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to define which of the control's events should be observed. - /// - /// Defines the binding's update mode. Use - /// to update the binding when - /// the source control loses the focus. You can also use - /// to update the binding - /// when the source control's property changes. - /// NOTE: At this time the PropertyChanged mode is inactive on iOS. Use - /// instead. - /// - /// The Binding instance. - /// When this method is called - /// on a OneTime binding. Such bindings cannot be updated. This exception can - /// also be thrown when the source object is null or has already been - /// garbage collected before this method is called. -#endif -#if ANDROID - /// - /// Define when the binding should be evaluated when the bound source object - /// is a control. Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to define which of the control's events should be observed. - /// - /// Defines the binding's update mode. Use - /// to update the binding when - /// the source control loses the focus. You can also use - /// to update the binding - /// when the source control's property changes. - /// The PropertyChanged mode should only be used with the following items: - /// - an EditText control and its Text property (TextChanged event). - /// - a CompoundButton control and its Checked property (CheckedChange event). - /// - /// The Binding instance. - /// When this method is called - /// on a OneTime binding. Such bindings cannot be updated. This exception can - /// also be thrown when the source object is null or has already been - /// garbage collected before this method is called. -#endif - public Binding UpdateSourceTrigger(UpdateTriggerMode mode) - { - switch (mode) - { - case UpdateTriggerMode.LostFocus: -#if ANDROID - return UpdateSourceTrigger("FocusChange"); -#else - throw new ArgumentException( - "UpdateTriggerMode.LostFocus is only supported in Android at this time", - "mode"); -#endif - - case UpdateTriggerMode.PropertyChanged: - return CheckControlSource(); - } - - return this; - } - /// /// Define when the binding should be evaluated when the bound source object /// is a control. Because Xamarin controls are not DependencyObjects, the @@ -487,7 +424,7 @@ namespace GalaSoft.MvvmLight.Helpers /// or is an empty string. /// When the requested event does not exist on the /// source control. - public Binding UpdateSourceTrigger(string eventName) + public Binding ObserveSourceEvent(string eventName) where TEventArgs : EventArgs { if (string.IsNullOrEmpty(eventName) @@ -523,7 +460,6 @@ namespace GalaSoft.MvvmLight.Helpers "eventName"); } - // TODO Do we need weak events here? EventHandler handler = HandleSourceEvent; var defaultHandlerInfo = _sourceHandlers.Values.FirstOrDefault(i => i.IsDefault); @@ -554,106 +490,6 @@ namespace GalaSoft.MvvmLight.Helpers return this; } -#if IOS - /// - /// Define that the binding should be evaluated when the bound control's target property changes. - /// Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to specify that the binding must be updated when the property changes. - /// - /// At this point, this method is inactive on iOS. Use - /// instead. - /// The Binding instance. - /// When this method is called - /// on a OneTime or a OneWay binding. This exception can - /// also be thrown when the target object is null or has already been - /// garbage collected before this method is called. -#endif -#if ANDROID - /// - /// Define that the binding should be evaluated when the bound control's target property changes. - /// Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to specify that the binding must be updated when the property changes. - /// - /// This method should only be used with the following items: - /// - an EditText control and its Text property (TextChanged event). - /// - a CompoundButton control and its Checked property (CheckedChange event). - /// - /// The Binding instance. - /// When this method is called - /// on a OneTime or a OneWay binding. This exception can - /// also be thrown when the target object is null or has already been - /// garbage collected before this method is called. -#endif - public Binding UpdateTargetTrigger() - { - return UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); - } - -#if IOS - /// - /// Define when the binding should be evaluated when the bound target object - /// is a control. Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to define which of the control's events should be observed. - /// - /// Defines the binding's update mode. Use - /// to update the binding when - /// the source control loses the focus. You can also use - /// to update the binding - /// when the source control's property changes. - /// NOTE: At this time the PropertyChanged mode is inactive on iOS. Use - /// instead. - /// - /// The Binding instance. - /// When this method is called - /// on a OneTime or a OneWay binding. This exception can - /// also be thrown when the source object is null or has already been - /// garbage collected before this method is called. -#endif -#if ANDROID - /// - /// Define when the binding should be evaluated when the bound target object - /// is a control. Because Xamarin controls are not DependencyObjects, the - /// bound property will not automatically update the binding attached to it. Instead, - /// use this method to define which of the control's events should be observed. - /// - /// Defines the binding's update mode. Use - /// to update the binding when - /// the source control loses the focus. You can also use - /// to update the binding - /// when the source control's property changes. - /// The PropertyChanged mode should only be used with the following items: - /// - an EditText control and its Text property (TextChanged event). - /// - a CompoundButton control and its Checked property (CheckedChange event). - /// - /// The Binding instance. - /// When this method is called - /// on a OneTime or a OneWay binding. This exception can - /// also be thrown when the source object is null or has already been - /// garbage collected before this method is called. -#endif - public Binding UpdateTargetTrigger(UpdateTriggerMode mode) - { - switch (mode) - { - case UpdateTriggerMode.LostFocus: -#if ANDROID - return UpdateTargetTrigger("FocusChange"); -#else - throw new ArgumentException( - "UpdateTriggerMode.LostFocus is only supported in Android at this time", - "mode"); -#endif - - case UpdateTriggerMode.PropertyChanged: - return CheckControlTarget(); - } - - return this; - } - /// /// Define when the binding should be evaluated when the bound target object /// is a control. Because Xamarin controls are not DependencyObjects, the @@ -671,7 +507,7 @@ namespace GalaSoft.MvvmLight.Helpers /// or is an empty string. /// When the requested event does not exist on the /// target control. - public Binding UpdateTargetTrigger(string eventName) + public Binding ObserveTargetEvent(string eventName) { if (string.IsNullOrEmpty(eventName)) { @@ -689,8 +525,6 @@ namespace GalaSoft.MvvmLight.Helpers throw new InvalidOperationException("Cannot use SetTargetEvent with onSourceUpdate"); } - // TODO Should also use the target chain - if (_propertyTarget == null || !_propertyTarget.IsAlive || _propertyTarget.Target == null) @@ -713,7 +547,6 @@ namespace GalaSoft.MvvmLight.Helpers "eventName"); } - // TODO Do we need weak events here? EventHandler handler = HandleTargetEvent; var defaultHandlerInfo = _targetHandlers.Values.FirstOrDefault(i => i.IsDefault); @@ -764,7 +597,7 @@ namespace GalaSoft.MvvmLight.Helpers /// or is an empty string. /// When the requested event does not exist on the /// target control. - public Binding UpdateTargetTrigger(string eventName) + public Binding ObserveTargetEvent(string eventName) where TEventArgs : EventArgs { if (string.IsNullOrEmpty(eventName)) @@ -805,7 +638,6 @@ namespace GalaSoft.MvvmLight.Helpers "eventName"); } - // TODO Do we need weak events here? EventHandler handler = HandleTargetEvent; var defaultHandlerInfo = _targetHandlers.Values.FirstOrDefault(i => i.IsDefault); @@ -862,6 +694,254 @@ namespace GalaSoft.MvvmLight.Helpers return this; } + private void Attach( + object source, + object target, + BindingMode mode) + { + var sourceChain = GetPropertyChain( + source, + null, + _sourcePropertyExpression.Body as MemberExpression, + _sourcePropertyName); + + var lastSourceInChain = sourceChain.Last(); + sourceChain.Remove(lastSourceInChain); + + _propertySource = new WeakReference(lastSourceInChain.Instance); + + if (mode != BindingMode.OneTime) + { + foreach (var instance in sourceChain) + { + var inpc = instance.Instance as INotifyPropertyChanged; + if (inpc != null) + { + var listener = new ObjectSwappedEventListener( + this, + inpc); + _listeners.Add(listener); + PropertyChangedEventManager.AddListener(inpc, listener, instance.Name); + } + } + } + + if (target != null + && _targetPropertyExpression != null + && _targetPropertyName != null) + { + var targetChain = GetPropertyChain( + target, + null, + _targetPropertyExpression.Body as MemberExpression, + _targetPropertyName); + + var lastTargetInChain = targetChain.Last(); + targetChain.Remove(lastTargetInChain); + + _propertyTarget = new WeakReference(lastTargetInChain.Instance); + + if (mode != BindingMode.OneTime) + { + foreach (var instance in targetChain) + { + var inpc = instance.Instance as INotifyPropertyChanged; + if (inpc != null) + { + var listener = new ObjectSwappedEventListener( + this, + inpc); + _listeners.Add(listener); + PropertyChangedEventManager.AddListener(inpc, listener, instance.Name); + } + } + } + } + + _isFallbackValueActive = false; + + if (sourceChain.Any(r => r.Instance == null)) + { + _isFallbackValueActive = true; + } + else + { + if (lastSourceInChain.Instance == null) + { + _isFallbackValueActive = true; + } + } + + Attach(); + } + + private void Attach() + { + if (_propertyTarget != null + && _propertyTarget.IsAlive + && _propertyTarget.Target != null + && !string.IsNullOrEmpty(_targetPropertyName)) + { + var targetType = _propertyTarget.Target.GetType(); + _targetProperty = targetType.GetProperty(_targetPropertyName); + + if (_targetProperty == null) + { + throw new InvalidOperationException("Property not found: " + _targetPropertyName); + } + } + + if (_propertySource == null + || !_propertySource.IsAlive + || _propertySource.Target == null) + { + SetSpecialValues(); + return; + } + + var sourceType = _propertySource.Target.GetType(); + _sourceProperty = sourceType.GetProperty(_sourcePropertyName); + + if (_sourceProperty == null) + { + throw new InvalidOperationException("Property not found: " + _sourcePropertyName); + } + + // OneTime binding + + if (CanBeConverted(_sourceProperty, _targetProperty)) + { + var value = GetSourceValue(); + + if (_targetProperty != null + && _propertyTarget != null + && _propertyTarget.IsAlive + && _propertyTarget.Target != null) + { + SetTargetValue(value); + } + + if (_onSourceUpdate != null + && _onSourceUpdate.IsAlive) + { + _onSourceUpdate.Execute(); + } + } + + if (Mode == BindingMode.OneTime) + { + return; + } + + // Check OneWay binding + var inpc = _propertySource.Target as INotifyPropertyChanged; + + if (inpc != null) + { + var listener = new PropertyChangedEventListener( + this, + true); + + _listeners.Add(listener); + PropertyChangedEventManager.AddListener(inpc, listener, _sourcePropertyName); + } + else + { + CheckControlSource(); + } + + if (Mode == BindingMode.OneWay + || Mode == BindingMode.Default) + { + return; + } + + // Check TwoWay binding + if (_onSourceUpdate == null + && _propertyTarget != null + && _propertyTarget.IsAlive + && _propertyTarget.Target != null) + { + var inpc2 = _propertyTarget.Target as INotifyPropertyChanged; + + if (inpc2 != null) + { + var listener = new PropertyChangedEventListener( + this, + false); + + _listeners.Add(listener); + PropertyChangedEventManager.AddListener(inpc2, listener, _targetPropertyName); + } + else + { + CheckControlTarget(); + } + } + } + + private bool CanBeConverted(PropertyInfo sourceProperty, PropertyInfo targetProperty) + { + if (targetProperty == null) + { + return true; + } + + var sourceType = sourceProperty.PropertyType; + var targetType = targetProperty.PropertyType; + + return sourceType == targetType + || (IsValueType(sourceType) && IsValueType(targetType)); + } + + private void DetachSourceHandlers() + { + if (_propertySource == null + || !_propertySource.IsAlive + || _propertySource.Target == null) + { + return; + } + + foreach (var eventName in _sourceHandlers.Keys) + { + var type = _propertySource.Target.GetType(); + var ev = type.GetEvent(eventName); + if (ev == null) + { + return; + } + + ev.RemoveEventHandler(_propertySource.Target, _sourceHandlers[eventName].Delegate); + } + + _sourceHandlers.Clear(); + } + + private void DetachTargetHandlers() + { + if (_propertySource == null + || !_propertySource.IsAlive + || _propertySource.Target == null) + { + return; + } + + foreach (var eventName in _targetHandlers.Keys) + { + var type = _propertyTarget.Target.GetType(); + var ev = type.GetEvent(eventName); + if (ev == null) + { + return; + } + + ev.RemoveEventHandler(_propertyTarget.Target, _targetHandlers[eventName].Delegate); + } + + _targetHandlers.Clear(); + } + private static IList GetPropertyChain( object topInstance, IList instances, @@ -970,300 +1050,13 @@ namespace GalaSoft.MvvmLight.Helpers return property.Name; } - private void Attach( - object source, - object target, - BindingMode mode) - { - var sourceChain = GetPropertyChain( - source, - null, - _sourcePropertyExpression.Body as MemberExpression, - _sourcePropertyName); - - var lastSourceInChain = sourceChain.Last(); - sourceChain.Remove(lastSourceInChain); - - _propertySource = new WeakReference(lastSourceInChain.Instance); - - if (mode != BindingMode.OneTime) - { - foreach (var instance in sourceChain) - { - var inpc = instance.Instance as INotifyPropertyChanged; - if (inpc != null) - { - var listener = new ObjectSwappedEventListener( - this, - inpc); - _listeners.Add(listener); - PropertyChangedEventManager.AddListener(inpc, listener, instance.Name); - } - } - } - - if (target != null - && _targetPropertyExpression != null - && _targetPropertyName != null) - { - var targetChain = GetPropertyChain( - target, - null, - _targetPropertyExpression.Body as MemberExpression, - _targetPropertyName); - - var lastTargetInChain = targetChain.Last(); - targetChain.Remove(lastTargetInChain); - - _propertyTarget = new WeakReference(lastTargetInChain.Instance); - - if (mode != BindingMode.OneTime) - { - foreach (var instance in targetChain) - { - var inpc = instance.Instance as INotifyPropertyChanged; - if (inpc != null) - { - var listener = new ObjectSwappedEventListener( - this, - inpc); - _listeners.Add(listener); - PropertyChangedEventManager.AddListener(inpc, listener, instance.Name); - } - } - } - } - - Attach(); - } - - private void Attach() - { - if (_propertySource == null - || !_propertySource.IsAlive - || _propertySource.Target == null) - { - return; - } - - if (_propertyTarget != null - && _propertyTarget.IsAlive - && _propertyTarget.Target != null - && !string.IsNullOrEmpty(_targetPropertyName)) - { - var targetType = _propertyTarget.Target.GetType(); - _targetProperty = targetType.GetProperty(_targetPropertyName); - - if (_targetProperty == null) - { - throw new InvalidOperationException("Property not found: " + _targetPropertyName); - } - } - - var sourceType = _propertySource.Target.GetType(); - _sourceProperty = sourceType.GetProperty(_sourcePropertyName); - - if (_sourceProperty == null) - { - throw new InvalidOperationException("Property not found: " + _sourcePropertyName); - } - - // OneTime binding - - if (CanBeConverted(_sourceProperty, _targetProperty)) - { - var value = GetSourceValue(); - - if (_targetProperty != null - && _propertyTarget != null - && _propertyTarget.IsAlive - && _propertyTarget.Target != null) - { - _targetProperty.SetValue(_propertyTarget.Target, value, null); - } - - if (_onSourceUpdate != null - && _onSourceUpdate.IsAlive) - { - _onSourceUpdate.Execute(); - } - } - - if (Mode == BindingMode.OneTime) - { - return; - } - - // Check OneWay binding - var inpc = _propertySource.Target as INotifyPropertyChanged; - - if (inpc != null) - { - var listener = new PropertyChangedEventListener( - this, - true); - - _listeners.Add(listener); - PropertyChangedEventManager.AddListener(inpc, listener, _sourcePropertyName); - } - else - { - CheckControlSource(); - } - - if (Mode == BindingMode.OneWay - || Mode == BindingMode.Default) - { - return; - } - - // Check TwoWay binding - if (_onSourceUpdate == null - && _propertyTarget != null - && _propertyTarget.IsAlive - && _propertyTarget.Target != null) - { - var inpc2 = _propertyTarget.Target as INotifyPropertyChanged; - - if (inpc2 != null) - { - var listener = new PropertyChangedEventListener( - this, - false); - - _listeners.Add(listener); - PropertyChangedEventManager.AddListener(inpc2, listener, _targetPropertyName); - } - else - { - CheckControlTarget(); - } - } - } - - private bool CanBeConverted(PropertyInfo sourceProperty, PropertyInfo targetProperty) - { - if (targetProperty == null) - { - return true; - } - - var sourceType = sourceProperty.PropertyType; - var targetType = targetProperty.PropertyType; - - return sourceType == targetType - || (IsValueType(sourceType) && IsValueType(targetType)); - } - - private Binding CheckControlSource() - { -#if ANDROID - var textBox = _propertySource.Target as EditText; - if (textBox != null) - { - var binding = UpdateSourceTrigger("TextChanged"); - binding._sourceHandlers["TextChanged"].IsDefault = true; - return binding; - } - - var checkbox = _propertySource.Target as CompoundButton; - if (checkbox != null) - { - var binding = UpdateSourceTrigger("CheckedChange"); - binding._sourceHandlers["CheckedChange"].IsDefault = true; - return binding; - } - - return this; -#endif - -#if IOS - return this; -#endif - } - - private Binding CheckControlTarget() - { - if (Mode != BindingMode.TwoWay) - { - return this; - } - -#if ANDROID - var textBox = _propertyTarget.Target as EditText; - if (textBox != null) - { - var binding = UpdateTargetTrigger("TextChanged"); - binding._targetHandlers["TextChanged"].IsDefault = true; - return binding; - } - - var checkbox = _propertyTarget.Target as CompoundButton; - if (checkbox != null) - { - var binding = UpdateTargetTrigger("CheckedChange"); - binding._targetHandlers["CheckedChange"].IsDefault = true; - return binding; - } - - return this; -#endif - -#if IOS - return this; -#endif - } - - private void DetachSourceHandlers() - { - if (_propertySource == null - || !_propertySource.IsAlive - || _propertySource.Target == null) - { - return; - } - - foreach (var eventName in _sourceHandlers.Keys) - { - var type = _propertySource.Target.GetType(); - var ev = type.GetEvent(eventName); - if (ev == null) - { - return; - } - - ev.RemoveEventHandler(_propertySource.Target, _sourceHandlers[eventName].Delegate); - } - - _sourceHandlers.Clear(); - } - - private void DetachTargetHandlers() - { - if (_propertySource == null - || !_propertySource.IsAlive - || _propertySource.Target == null) - { - return; - } - - foreach (var eventName in _targetHandlers.Keys) - { - var type = _propertyTarget.Target.GetType(); - var ev = type.GetEvent(eventName); - if (ev == null) - { - return; - } - - ev.RemoveEventHandler(_propertyTarget.Target, _targetHandlers[eventName].Delegate); - } - - _targetHandlers.Clear(); - } - private TTarget GetSourceValue() { + if (_sourceProperty == null) + { + return default(TTarget); + } + var sourceValue = (TSource)_sourceProperty.GetValue(_propertySource.Target, null); return _converter.Convert(sourceValue); } @@ -1293,7 +1086,7 @@ namespace GalaSoft.MvvmLight.Helpers if (_targetProperty != null) { - _targetProperty.SetValue(_propertyTarget.Target, valueLocal, null); + SetTargetValue(valueLocal); } } @@ -1322,12 +1115,23 @@ namespace GalaSoft.MvvmLight.Helpers return; } - _sourceProperty.SetValue(_propertySource.Target, valueLocal, null); + SetSourceValue(valueLocal); } RaiseValueChanged(); } + private bool IsSourceDefaultValue() + { + if (_sourceProperty == null) + { + return true; + } + + var sourceValue = (TSource)_sourceProperty.GetValue(_propertySource.Target, null); + return Equals(default(TSource), sourceValue); + } + private bool IsValueType(Type type) { return type.IsPrimitive || type == typeof (string); @@ -1342,6 +1146,44 @@ namespace GalaSoft.MvvmLight.Helpers } } + private void SetSourceValue(TSource value) + { + _sourceProperty.SetValue(_propertySource.Target, value, null); + } + + private bool SetSpecialValues() + { + if (_isFallbackValueActive) + { + _targetProperty.SetValue(_propertyTarget.Target, FallbackValue, null); + return true; + } + + if (!Equals(default(TTarget), TargetNullValue)) + { + if (IsSourceDefaultValue()) + { + _targetProperty.SetValue(_propertyTarget.Target, _converter.Convert(TargetNullValue), null); + return true; + } + } + + return false; + } + + private void SetTargetValue(TTarget value) + { + if (!SetSpecialValues()) + { + _targetProperty.SetValue(_propertyTarget.Target, value, null); + } + } + + /// + /// Occurs when the value of the databound property changes. + /// + public override event EventHandler ValueChanged; + internal class ObjectSwappedEventListener : IWeakEventListener { private readonly WeakReference _bindingReference; @@ -1444,6 +1286,12 @@ namespace GalaSoft.MvvmLight.Helpers } } + private class DelegateInfo + { + public Delegate Delegate; + public bool IsDefault; + } + private class SimpleConverter { private WeakFunc _convert; @@ -1495,11 +1343,5 @@ namespace GalaSoft.MvvmLight.Helpers _convertBack = new WeakFunc(convertBack); } } - - private class DelegateInfo - { - public Delegate Delegate; - public bool IsDefault; - } } } \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericAndroid.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericAndroid.cs new file mode 100644 index 0000000..887d8b6 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericAndroid.cs @@ -0,0 +1,170 @@ +// **************************************************************************** +// +// Copyright © GalaSoft Laurent Bugnion 2009-2015 +// +// **************************************************************************** +// Laurent Bugnion +// laurent@galasoft.ch +// 22.01.2016 +// GalaSoft.MvvmLight +// http://www.mvvmlight.net +// +// See license.txt in this solution or http://www.galasoft.ch/license_MIT.txt +// +// **************************************************************************** + +using System; +using Android.Text; +using Android.Views; +using Android.Widget; + +namespace GalaSoft.MvvmLight.Helpers +{ + // Partial class for Android only. + public partial class Binding + { + /// + /// Define that the binding should be evaluated when the bound control's source property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// This method should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveSourceEvent() + { + return ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + } + + /// + /// Define when the binding should be evaluated when the bound source object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// The PropertyChanged mode should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveSourceEvent(UpdateTriggerMode mode) + { + switch (mode) + { + case UpdateTriggerMode.LostFocus: + return ObserveSourceEvent("FocusChange"); + + case UpdateTriggerMode.PropertyChanged: + return CheckControlSource(); + } + + return this; + } + + /// + /// Define that the binding should be evaluated when the bound control's target property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// This method should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the target object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveTargetEvent() + { + return ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + } + + /// + /// Define when the binding should be evaluated when the bound target object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// The PropertyChanged mode should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveTargetEvent(UpdateTriggerMode mode) + { + switch (mode) + { + case UpdateTriggerMode.LostFocus: + return ObserveTargetEvent("FocusChange"); + + case UpdateTriggerMode.PropertyChanged: + return CheckControlTarget(); + } + + return this; + } + + private Binding CheckControl() + { + var textBox = _propertySource.Target as EditText; + if (textBox != null) + { + var binding = ObserveSourceEvent("TextChanged"); + binding._sourceHandlers["TextChanged"].IsDefault = true; + return binding; + } + + var checkbox = _propertySource.Target as CompoundButton; + if (checkbox != null) + { + var binding = ObserveSourceEvent("CheckedChange"); + binding._sourceHandlers["CheckedChange"].IsDefault = true; + return binding; + } + + return this; + } + + private Binding CheckControlSource() + { + return CheckControl(); + } + + private Binding CheckControlTarget() + { + if (Mode != BindingMode.TwoWay) + { + return this; + } + + return CheckControl(); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsolete.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsolete.cs new file mode 100644 index 0000000..79549f2 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsolete.cs @@ -0,0 +1,108 @@ +using System; + +namespace GalaSoft.MvvmLight.Helpers +{ + // These methods are obsoleted and will be removed in a future version. + public partial class Binding : Binding + { + /// + /// Define when the binding should be evaluated when the bound source object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// The name of the event that should be observed + /// to update the binding's value. + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + /// When the eventName parameter is null + /// or is an empty string. + /// When the requested event does not exist on the + /// source control. + [Obsolete("This method will be removed in a future version. Please use ObserveSourceEvent instead.")] + public Binding UpdateSourceTrigger(string eventName) + { + return ObserveSourceEvent(eventName); + } + + /// + /// Define when the binding should be evaluated when the bound source object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Use this method when the event requires a specific EventArgs type + /// instead of the standard EventHandler. + /// The type of the EventArgs used by this control's event. + /// The name of the event that should be observed + /// to update the binding's value. + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + /// When the eventName parameter is null + /// or is an empty string. + /// When the requested event does not exist on the + /// source control. + [Obsolete("This method will be removed in a future version. Please use ObserveSourceEvent instead.")] + public Binding UpdateSourceTrigger(string eventName) + where TEventArgs : EventArgs + { + return ObserveSourceEvent(eventName); + } + + /// + /// Define when the binding should be evaluated when the bound target object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// The name of the event that should be observed + /// to update the binding's value. + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + /// When the eventName parameter is null + /// or is an empty string. + /// When the requested event does not exist on the + /// target control. + [Obsolete("This method will be removed in a future version. Please use ObserveTargetEvent instead.")] + public Binding UpdateTargetTrigger(string eventName) + { + return ObserveTargetEvent(eventName); + } + + /// + /// Define when the binding should be evaluated when the bound target object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Use this method when the event requires a specific EventArgs type + /// instead of the standard EventHandler. + /// The type of the EventArgs used by this control's event. + /// The name of the event that should be observed + /// to update the binding's value. + /// The Binding instance. + /// When this method is called + /// on a OneTime or OneWay binding. This exception can + /// also be thrown when the target object is null or has already been + /// garbage collected before this method is called. + /// When the eventName parameter is null + /// or is an empty string. + /// When the requested event does not exist on the + /// target control. + [Obsolete("This method will be removed in a future version. Please use ObserveTargetEvent instead.")] + public Binding UpdateTargetTrigger(string eventName) + where TEventArgs : EventArgs + { + return ObserveTargetEvent(eventName); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsoleteAndroid.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsoleteAndroid.cs new file mode 100644 index 0000000..44e1b38 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/BindingGenericObsoleteAndroid.cs @@ -0,0 +1,102 @@ +using System; + +namespace GalaSoft.MvvmLight.Helpers +{ + // These methods are obsoleted and will be removed in a future version. + public partial class Binding + { + /// + /// Define that the binding should be evaluated when the bound control's source property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// This method should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + [Obsolete("This method will be removed in a future version. Please use ObserveSourceEvent instead.")] + public Binding UpdateSourceTrigger() + { + return ObserveSourceEvent(); + } + + /// + /// Define when the binding should be evaluated when the bound source object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// The PropertyChanged mode should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + [Obsolete("This method will be removed in a future version. Please use ObserveSourceEvent instead.")] + public Binding UpdateSourceTrigger(UpdateTriggerMode mode) + { + return ObserveSourceEvent(mode); + } + + /// + /// Define that the binding should be evaluated when the bound control's target property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// This method should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the target object is null or has already been + /// garbage collected before this method is called. + [Obsolete("This method will be removed in a future version. Please use ObserveTargetEvent instead.")] + public Binding UpdateTargetTrigger() + { + return ObserveTargetEvent(); + } + + /// + /// Define when the binding should be evaluated when the bound target object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// The PropertyChanged mode should only be used with the following items: + /// - an EditText control and its Text property (TextChanged event). + /// - a CompoundButton control and its Checked property (CheckedChange event). + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + [Obsolete("This method will be removed in a future version. Please use ObserveTargetEvent instead.")] + public Binding UpdateTargetTrigger(UpdateTriggerMode mode) + { + return ObserveTargetEvent(mode); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Extensions.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Extensions.cs index cbce393..d6e9bb5 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Extensions.cs +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/Extensions.cs @@ -14,20 +14,11 @@ // **************************************************************************** using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Linq.Expressions; +using System.Reflection; +using System.Windows.Input; using GalaSoft.MvvmLight.Command; -#if ANDROID -using Android.Views; -#endif - -#if IOS -using Foundation; -using UIKit; -#endif - namespace GalaSoft.MvvmLight.Helpers { /// @@ -221,14 +212,70 @@ namespace GalaSoft.MvvmLight.Helpers } /// - /// Sets a generic RelayCommand to an object and actuate the command when a specific event is raised. This method + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The element to which the command is added. + /// The name of the event that will be subscribed to to actuate the command. + /// The command that must be added to the element. + /// A Binding instance subscribed to + /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + /// will be observed and changes will be passed to the command, for example to update the CanExecute. + public static void SetCommand( + this object element, + string eventName, + RelayCommand command, + Binding commandParameterBinding) + { + var t = element.GetType(); + var e = t.GetEventInfoForControl(eventName); + + var castedBinding = (Binding)commandParameterBinding; + + EventHandler handler = (s, args) => + { + var param = castedBinding == null ? default(T) : castedBinding.Value; + + if (command.CanExecute(param)) + { + command.Execute(param); + } + }; + + e.AddEventHandler( + element, + handler); + + if (commandParameterBinding == null) + { + return; + } + + var enabledProperty = t.GetProperty("Enabled"); + if (enabledProperty != null) + { + enabledProperty.SetValue(element, command.CanExecute(castedBinding.Value)); + + command.CanExecuteChanged += (s, args) => enabledProperty.SetValue( + element, + command.CanExecute(castedBinding.Value)); + + commandParameterBinding.ValueChanged += (s, args) => enabledProperty.SetValue( + element, + command.CanExecute(castedBinding.Value)); + } + } + + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method /// should be used when the event uses an EventHandler<TEventArgs>. /// /// The type of the CommandParameter that will be passed to the RelayCommand. /// The type of the event's arguments. /// The element to which the command is added. - /// The name of the event that will be subscribed to to actuate the command. /// The command that must be added to the element. + /// The name of the event that will be subscribed to to actuate the command. /// A Binding instance subscribed to /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter /// will be observed and changes will be passed to the command, for example to update the CanExecute. @@ -236,17 +283,12 @@ namespace GalaSoft.MvvmLight.Helpers this object element, string eventName, RelayCommand command, - Binding commandParameterBinding = null) + Binding commandParameterBinding) { var castedBinding = (Binding)commandParameterBinding; var t = element.GetType(); - var e = t.GetEvent(eventName); - - if (e == null) - { - throw new ArgumentException("Event not found: " + eventName, "eventName"); - } + var e = t.GetEventInfoForControl(eventName); EventHandler handler = (s, args) => { @@ -283,68 +325,7 @@ namespace GalaSoft.MvvmLight.Helpers } /// - /// Sets a generic RelayCommand to an object and actuate the command when a specific event is raised. This method - /// can only be used when the event uses a standard EventHandler. - /// - /// The type of the CommandParameter that will be passed to the RelayCommand. - /// The element to which the command is added. - /// The name of the event that will be subscribed to to actuate the command. - /// The command that must be added to the element. - /// A Binding instance subscribed to - /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter - /// will be observed and changes will be passed to the command, for example to update the CanExecute. - public static void SetCommand( - this object element, - string eventName, - RelayCommand command, - Binding commandParameterBinding = null) - { - var castedBinding = (Binding)commandParameterBinding; - - var t = element.GetType(); - var e = t.GetEvent(eventName); - - if (e == null) - { - throw new ArgumentException("Event not found: " + eventName, "eventName"); - } - - EventHandler handler = (s, args) => - { - var param = castedBinding == null ? default(T) : castedBinding.Value; - - if (command.CanExecute(param)) - { - command.Execute(param); - } - }; - - e.AddEventHandler( - element, - handler); - - if (commandParameterBinding == null) - { - return; - } - - var enabledProperty = t.GetProperty("Enabled"); - if (enabledProperty != null) - { - enabledProperty.SetValue(element, command.CanExecute(castedBinding.Value)); - - commandParameterBinding.ValueChanged += (s, args) => enabledProperty.SetValue( - element, - command.CanExecute(castedBinding.Value)); - - command.CanExecuteChanged += (s, args) => enabledProperty.SetValue( - element, - command.CanExecute(castedBinding.Value)); - } - } - - /// - /// Sets a non-generic RelayCommand to an object and actuate the command when a specific event is raised. This method + /// Sets a non-generic RelayCommand to an object and actuates the command when a specific event is raised. This method /// can only be used when the event uses a standard EventHandler. /// /// The element to which the command is added. @@ -353,15 +334,10 @@ namespace GalaSoft.MvvmLight.Helpers public static void SetCommand( this object element, string eventName, - RelayCommand command) + ICommand command) { var t = element.GetType(); - var e = t.GetEvent(eventName); - - if (e == null) - { - throw new ArgumentException("Event not found: " + eventName, "eventName"); - } + var e = t.GetEventInfoForControl(eventName); EventHandler handler = (s, args) => { @@ -379,117 +355,393 @@ namespace GalaSoft.MvvmLight.Helpers if (enabledProperty != null) { enabledProperty.SetValue(element, command.CanExecute(null)); - } - command.CanExecuteChanged += (s, args) => + command.CanExecuteChanged += (s, args) => enabledProperty.SetValue( + element, + command.CanExecute(null)); + } + } + + /// + /// Sets a non-generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// + /// The type of the event's arguments. + /// The element to which the command is added. + /// The name of the event that will be subscribed to to actuate the command. + /// The command that must be added to the element. + public static void SetCommand( + this object element, + string eventName, + ICommand command) + { + var t = element.GetType(); + var e = t.GetEventInfoForControl(eventName); + + EventHandler handler = (s, args) => { - if (enabledProperty != null) + if (command.CanExecute(null)) { - enabledProperty.SetValue(element, command.CanExecute(null)); + command.Execute(null); } }; + + e.AddEventHandler( + element, + handler); + + var enabledProperty = t.GetProperty("Enabled"); + if (enabledProperty != null) + { + enabledProperty.SetValue(element, command.CanExecute(null)); + + command.CanExecuteChanged += (s, args) => enabledProperty.SetValue( + element, + command.CanExecute(null)); + } + } + + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The element to which the command is added. + /// The command that must be added to the element. + /// The name of the event that will be subscribed to to actuate the command. + /// The command parameter that will be passed to the RelayCommand when it + /// is executed. This is a fixed value. To pass an observable value, use one of the SetCommand + /// overloads that uses a Binding as CommandParameter. + public static void SetCommand( + this object element, + string eventName, + RelayCommand command, + T commandParameter) + { + var t = element.GetType(); + var e = t.GetEventInfoForControl(eventName); + + EventHandler handler = (s, args) => + { + if (command.CanExecute(commandParameter)) + { + command.Execute(commandParameter); + } + }; + + e.AddEventHandler( + element, + handler); + + var enabledProperty = t.GetProperty("Enabled"); + if (enabledProperty != null) + { + enabledProperty.SetValue(element, command.CanExecute(commandParameter)); + + command.CanExecuteChanged += (s, args) => enabledProperty.SetValue( + element, + command.CanExecute(commandParameter)); + } + } + + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. + /// The name of the event that will be subscribed to to actuate the command. + /// The command parameter that will be passed to the RelayCommand when it + /// is executed. This is a fixed value. To pass an observable value, use one of the SetCommand + /// overloads that uses a Binding as CommandParameter. + public static void SetCommand( + this object element, + string eventName, + RelayCommand command, + T commandParameter) + { + var t = element.GetType(); + var e = t.GetEventInfoForControl(eventName); + + EventHandler handler = (s, args) => + { + if (command.CanExecute(commandParameter)) + { + command.Execute(commandParameter); + } + }; + + e.AddEventHandler( + element, + handler); + + var enabledProperty = t.GetProperty("Enabled"); + if (enabledProperty != null) + { + enabledProperty.SetValue(element, command.CanExecute(commandParameter)); + + command.CanExecuteChanged += (s, args) => enabledProperty.SetValue( + element, + command.CanExecute(commandParameter)); + } } #if ANDROID - /// - /// Creates a new for a given . + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For CheckBox: CheckedChange. + /// - For Button: Click. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. /// - /// The type of the items contained in the . - /// The collection that the adapter will be created for. - /// A method taking an item's position in the list, the item itself, - /// and a recycled Android View, and returning an adapted View for this item. Note that the recycled - /// view might be null, in which case a new View must be inflated by this method. - /// A View adapted for the item passed as parameter. - public static ObservableAdapter GetAdapter( - this ObservableCollection collection, - Func getTemplateDelegate) - { - return new ObservableAdapter - { - DataSource = collection, - GetTemplateDelegate = getTemplateDelegate - }; - } - + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The element to which the command is added. + /// The command that must be added to the element. + /// A Binding instance subscribed to + /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + /// will be observed and changes will be passed to the command, for example to update the CanExecute. +#elif __IOS__ /// - /// Creates a new for a given . + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For UIBarButtonItem: Clicked. + /// - For UIButton: TouchUpInside. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. /// - /// The type of the items contained in the . - /// The list that the adapter will be created for. - /// A method taking an item's position in the list, the item itself, - /// and a recycled Android , and returning an adapted View for this item. Note that the recycled - /// View might be null, in which case a new View must be inflated by this method. - /// An adapter adapted to the collection passed in parameter.. - public static ObservableAdapter GetAdapter( - this IList list, - Func getTemplateDelegate) - { - return new ObservableAdapter - { - DataSource = list, - GetTemplateDelegate = getTemplateDelegate - }; - } - + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The element to which the command is added. + /// The command that must be added to the element. + /// A Binding instance subscribed to + /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + /// will be observed and changes will be passed to the command, for example to update the CanExecute. #endif - -#if IOS - - /// - /// Creates a new for a given . - /// - /// The type of the items contained in the collection. - /// The collection that the adapter will be created for. - /// A delegate to a method creating or reusing a . - /// The cell will then be passed to the bindCellDelegate - /// delegate to set the elements' properties. - /// A delegate to a method taking a - /// and setting its elements' properties according to the item - /// passed as second parameter. - /// The cell must be created first in the createCellDelegate - /// delegate. - /// A controller adapted to the collection passed in parameter. - public static ObservableTableViewController GetController( - this ObservableCollection collection, - Func createCellDelegate, - Action bindCellDelegate) + public static void SetCommand( + this object element, + RelayCommand command, + Binding commandParameterBinding) { - return new ObservableTableViewController - { - DataSource = collection, - CreateCellDelegate = createCellDelegate, - BindCellDelegate = bindCellDelegate - }; + SetCommand(element, string.Empty, command, commandParameterBinding); } +#if ANDROID /// - /// Creates a new for a given . + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For CheckBox: CheckedChange. + /// - For Button: Click. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. /// - /// The type of the items contained in the list. - /// The list that the adapter will be created for. - /// A delegate to a method creating or reusing a . - /// The cell will then be passed to the bindCellDelegate - /// delegate to set the elements' properties. - /// A delegate to a method taking a - /// and setting its elements' properties according to the item - /// passed as second parameter. - /// The cell must be created first in the createCellDelegate - /// delegate. - /// A controller adapted to the collection passed in parameter. - public static ObservableTableViewController GetController( - this IList list, - Func createCellDelegate, - Action bindCellDelegate) - { - return new ObservableTableViewController - { - DataSource = list, - CreateCellDelegate = createCellDelegate, - BindCellDelegate = bindCellDelegate - }; - } - + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. + /// A Binding instance subscribed to + /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + /// will be observed and changes will be passed to the command, for example to update the CanExecute. +#elif __IOS__ + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For UIBarButtonItem: Clicked. + /// - For UIButton: TouchUpInside. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. + /// A Binding instance subscribed to + /// the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + /// will be observed and changes will be passed to the command, for example to update the CanExecute. #endif + public static void SetCommand( + this object element, + RelayCommand command, + Binding commandParameterBinding) + { + SetCommand(element, string.Empty, command, commandParameterBinding); + } + +#if ANDROID + /// + /// Sets an ICommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For CheckBox: CheckedChange. + /// - For Button: Click. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The element to which the command is added. + /// The command that must be added to the element. +#elif __IOS__ + /// + /// Sets an ICommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For UIBarButtonItem: Clicked. + /// - For UIButton: TouchUpInside. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The element to which the command is added. + /// The command that must be added to the element. +#endif + public static void SetCommand( + this object element, + ICommand command) + { + SetCommand(element, string.Empty, command); + } + +#if ANDROID + /// + /// Sets an ICommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For CheckBox: CheckedChange. + /// - For Button: Click. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. +#elif __IOS__ + /// + /// Sets an ICommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For UIBarButtonItem: Clicked. + /// - For UIButton: TouchUpInside. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. +#endif + public static void SetCommand( + this object element, + ICommand command) + { + SetCommand(element, string.Empty, command); + } + +#if ANDROID + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For CheckBox: CheckedChange. + /// - For Button: Click. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The element to which the command is added. + /// The command that must be added to the element. + /// The command parameter that will be passed to the RelayCommand when it + /// is executed. This is a fixed value. To pass an observable value, use one of the SetCommand + /// overloads that uses a Binding as CommandParameter. +#elif __IOS__ + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// can only be used when the event uses a standard EventHandler. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For UIBarButtonItem: Clicked. + /// - For UIButton: TouchUpInside. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The element to which the command is added. + /// The command that must be added to the element. + /// The command parameter that will be passed to the RelayCommand when it + /// is executed. This is a fixed value. To pass an observable value, use one of the SetCommand + /// overloads that uses a Binding as CommandParameter. +#endif + public static void SetCommand( + this object element, + RelayCommand command, + T commandParameter) + { + SetCommand(element, string.Empty, command, commandParameter); + } + +#if ANDROID + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For CheckBox: CheckedChange. + /// - For Button: Click. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. + /// The command parameter that will be passed to the RelayCommand when it + /// is executed. This is a fixed value. To pass an observable value, use one of the SetCommand + /// overloads that uses a Binding as CommandParameter. +#elif __IOS__ + /// + /// Sets a generic RelayCommand to an object and actuates the command when a specific event is raised. This method + /// should be used when the event uses an EventHandler<TEventArgs>. + /// This method does not specify the observed event explicitly. The following events are used: + /// - For UIBarButtonItem: Clicked. + /// - For UIButton: TouchUpInside. + /// - At the moment, no other controls are supported. For other controls, use another SetCommand overload + /// and specify the eventName parameter explicitly. + /// + /// The type of the CommandParameter that will be passed to the RelayCommand. + /// The type of the event's arguments. + /// The element to which the command is added. + /// The command that must be added to the element. + /// The command parameter that will be passed to the RelayCommand when it + /// is executed. This is a fixed value. To pass an observable value, use one of the SetCommand + /// overloads that uses a Binding as CommandParameter. +#endif + public static void SetCommand( + this object element, + RelayCommand command, + T commandParameter) + { + SetCommand(element, string.Empty, command, commandParameter); + } + + internal static EventInfo GetEventInfoForControl(this Type type, string eventName) + { + if (string.IsNullOrEmpty(eventName)) + { + eventName = type.GetDefaultEventNameForControl(); + } + + if (string.IsNullOrEmpty(eventName)) + { + throw new ArgumentException("Event not found", "eventName"); + } + + var info = type.GetEvent(eventName); + + if (info == null) + { + throw new ArgumentException("Event not found: " + eventName, "eventName"); + } + + return info; + } } } \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/ExtensionsAndroid.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/ExtensionsAndroid.cs new file mode 100644 index 0000000..3c60385 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/ExtensionsAndroid.cs @@ -0,0 +1,88 @@ +// **************************************************************************** +// +// Copyright © GalaSoft Laurent Bugnion 2009-2016 +// +// **************************************************************************** +// Laurent Bugnion +// laurent@galasoft.ch +// 19.01.2016 +// GalaSoft.MvvmLight +// http://www.mvvmlight.net +// +// See license.txt in this solution or http://www.galasoft.ch/license_MIT.txt +// +// **************************************************************************** + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Android.Views; +using Android.Widget; + +namespace GalaSoft.MvvmLight.Helpers +{ + /// + /// Defines extension methods for Android only. + /// + ////[ClassInfo(typeof(Binding))] + public static class ExtensionsAndroid + { + /// + /// Creates a new for a given . + /// + /// The type of the items contained in the . + /// The collection that the adapter will be created for. + /// A method taking an item's position in the list, the item itself, + /// and a recycled Android View, and returning an adapted View for this item. Note that the recycled + /// view might be null, in which case a new View must be inflated by this method. + /// A View adapted for the item passed as parameter. + public static ObservableAdapter GetAdapter( + this ObservableCollection collection, + Func getTemplateDelegate) + { + return new ObservableAdapter + { + DataSource = collection, + GetTemplateDelegate = getTemplateDelegate + }; + } + + /// + /// Creates a new for a given . + /// + /// The type of the items contained in the . + /// The list that the adapter will be created for. + /// A method taking an item's position in the list, the item itself, + /// and a recycled Android , and returning an adapted View for this item. Note that the recycled + /// View might be null, in which case a new View must be inflated by this method. + /// An adapter adapted to the collection passed in parameter.. + public static ObservableAdapter GetAdapter( + this IList list, + Func getTemplateDelegate) + { + return new ObservableAdapter + { + DataSource = list, + GetTemplateDelegate = getTemplateDelegate + }; + } + + internal static string GetDefaultEventNameForControl(this Type type) + { + string eventName = null; + + if (type == typeof (CheckBox) + || typeof (CheckBox).IsAssignableFrom(type)) + { + eventName = "CheckedChange"; + } + else if (type == typeof (Button) + || typeof (Button).IsAssignableFrom(type)) + { + eventName = "Click"; + } + + return eventName; + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/IWeakEventListener.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/IWeakEventListener.cs index 6b7649c..27908e9 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/IWeakEventListener.cs +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/IWeakEventListener.cs @@ -37,4 +37,4 @@ namespace System.Windows /// bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e); } -} +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/PropertyChangedEventManager.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/PropertyChangedEventManager.cs index 5a29043..acbb615 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/PropertyChangedEventManager.cs +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (Android)/Helpers/PropertyChangedEventManager.cs @@ -13,9 +13,9 @@ // // **************************************************************************** -using System.Linq; -using System.ComponentModel; using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; // ReSharper disable CheckNamespace namespace System.Windows @@ -29,31 +29,21 @@ namespace System.Windows ////[ClassInfo(typeof(Binding))] public class PropertyChangedEventManager { - private class ListenerInfo + private static PropertyChangedEventManager _manager; + private static readonly object SyncLock = new object(); + private Dictionary> _list; + + /// + /// Get the current instance of + /// + private static PropertyChangedEventManager Instance { - public IWeakEventListener Listener + get { - get; - private set; - } - - public WeakReference InstanceReference - { - get; - private set; - } - - public ListenerInfo(IWeakEventListener listener, INotifyPropertyChanged inpc) - { - Listener = listener; - InstanceReference = new WeakReference(inpc); + return _manager ?? (_manager = new PropertyChangedEventManager()); } } - private Dictionary> _list; - private static readonly object SyncLock = new object(); - private static PropertyChangedEventManager _manager; - /// /// Adds the specified listener to the list of listeners on the specified source. /// @@ -62,8 +52,8 @@ namespace System.Windows /// The name of the property that exists on /// source upon which to listen for changes. public static void AddListener( - INotifyPropertyChanged source, - IWeakEventListener listener, + INotifyPropertyChanged source, + IWeakEventListener listener, string propertyName) { Instance.PrivateAddListener(source, listener, propertyName); @@ -79,77 +69,6 @@ namespace System.Windows Instance.PrivateRemoveListener(listener); } - /// - /// Get the current instance of - /// - private static PropertyChangedEventManager Instance - { - get - { - return _manager ?? (_manager = new PropertyChangedEventManager()); - } - } - - /// - /// Begin listening for the event on - /// the provided source. - /// - /// The object on which to start listening - /// for . - private void StartListening(INotifyPropertyChanged source) - { - if (source != null) - { - source.PropertyChanged += PropertyChanged; - } - } - - /// - /// Stop listening for the event on the - /// provided source. - /// - /// The object on which to start listening for - /// . - private void StopListening(INotifyPropertyChanged source) - { - if (source != null) - { - source.PropertyChanged -= PropertyChanged; - } - } - - /// - /// The method that handles the event. - /// - /// The source of the event. - /// A that - /// contains the event data. - private void PropertyChanged(object sender, PropertyChangedEventArgs args) - { - if (!_list.ContainsKey(args.PropertyName)) - { - return; - } - - var list = _list[args.PropertyName]; - if (list != null) - { - var recipients = - list.Where( - i => i.InstanceReference != null - && i.InstanceReference.IsAlive - && i.InstanceReference.Target == sender - && i.Listener != null) - .ToList(); - - // We have the listeners. Deal with them - foreach (var item in recipients) - { - item.Listener.ReceiveWeakEvent(GetType(), sender, args); - } - } - } - /// /// Private method to add the specified listener to the list of listeners /// on the specified source. @@ -159,8 +78,8 @@ namespace System.Windows /// The name of the property that exists /// on source upon which to listen for changes. private void PrivateAddListener( - INotifyPropertyChanged source, - IWeakEventListener listener, + INotifyPropertyChanged source, + IWeakEventListener listener, string propertyName) { if (source == null) @@ -168,19 +87,19 @@ namespace System.Windows return; } - if (_list == null) - { - _list = new Dictionary>(); - } - lock (SyncLock) { + if (_list == null) + { + _list = new Dictionary>(); + } + var sourceExists = _list.Any( list => list.Value.Any( - entry => entry.InstanceReference != null - && entry.InstanceReference.IsAlive - && entry.InstanceReference.Target != null - && entry.InstanceReference.Target.Equals(source))); + entry => entry.InstanceReference != null + && entry.InstanceReference.IsAlive + && entry.InstanceReference.Target != null + && entry.InstanceReference.Target.Equals(source))); if (_list.ContainsKey(propertyName)) { @@ -254,5 +173,86 @@ namespace System.Windows } } } + + /// + /// The method that handles the event. + /// + /// The source of the event. + /// A that + /// contains the event data. + private void PropertyChanged(object sender, PropertyChangedEventArgs args) + { + if (!_list.ContainsKey(args.PropertyName)) + { + return; + } + + var list = _list[args.PropertyName]; + if (list != null) + { + var recipients = + list.Where( + i => i.InstanceReference != null + && i.InstanceReference.IsAlive + && i.InstanceReference.Target == sender + && i.Listener != null) + .ToList(); + + // We have the listeners. Deal with them + foreach (var item in recipients) + { + item.Listener.ReceiveWeakEvent(GetType(), sender, args); + } + } + } + + /// + /// Begin listening for the event on + /// the provided source. + /// + /// The object on which to start listening + /// for . + private void StartListening(INotifyPropertyChanged source) + { + if (source != null) + { + source.PropertyChanged += PropertyChanged; + } + } + + /// + /// Stop listening for the event on the + /// provided source. + /// + /// The object on which to start listening for + /// . + private void StopListening(INotifyPropertyChanged source) + { + if (source != null) + { + source.PropertyChanged -= PropertyChanged; + } + } + + private class ListenerInfo + { + public WeakReference InstanceReference + { + get; + private set; + } + + public IWeakEventListener Listener + { + get; + private set; + } + + public ListenerInfo(IWeakEventListener listener, INotifyPropertyChanged inpc) + { + Listener = listener; + InstanceReference = new WeakReference(inpc); + } + } } } \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/GalaSoft.MvvmLight.Platform (iOS).csproj b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/GalaSoft.MvvmLight.Platform (iOS).csproj index b5bf1d6..c46c508 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/GalaSoft.MvvmLight.Platform (iOS).csproj +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/GalaSoft.MvvmLight.Platform (iOS).csproj @@ -43,6 +43,9 @@ Helpers\BindingGeneric.cs + + Helpers\BindingGenericObsolete.cs + Helpers\BindingMode.cs @@ -61,6 +64,9 @@ Properties\AssemblyInfo.cs + + + diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericApple.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericApple.cs new file mode 100644 index 0000000..d8ede80 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericApple.cs @@ -0,0 +1,177 @@ +// **************************************************************************** +// +// Copyright © GalaSoft Laurent Bugnion 2009-2015 +// +// **************************************************************************** +// Laurent Bugnion +// laurent@galasoft.ch +// 22.01.2016 +// GalaSoft.MvvmLight +// http://www.mvvmlight.net +// +// See license.txt in this solution or http://www.galasoft.ch/license_MIT.txt +// +// **************************************************************************** + +using System; +using UIKit; + +namespace GalaSoft.MvvmLight.Helpers +{ + // Partial class for Apple only. + public partial class Binding + { + /// + /// Define that the binding should be evaluated when the bound control's source property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// At this point, this method is inactive on iOS. Use + /// instead. + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveSourceEvent() + { + return ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + } + + /// + /// Define when the binding should be evaluated when the bound source object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// NOTE: At this time the PropertyChanged mode is inactive on iOS. Use + /// instead. + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveSourceEvent(UpdateTriggerMode mode) + { + switch (mode) + { + case UpdateTriggerMode.LostFocus: + throw new ArgumentException( + "UpdateTriggerMode.LostFocus is only supported in Android at this time", + "mode"); + + case UpdateTriggerMode.PropertyChanged: + return CheckControlSource(); + } + + return this; + } + + /// + /// Define that the binding should be evaluated when the bound control's target property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// At this point, this method is inactive on iOS. Use + /// instead. + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the target object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveTargetEvent() + { + return ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + } + + /// + /// Define when the binding should be evaluated when the bound target object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// NOTE: At this time the PropertyChanged mode is inactive on iOS. Use + /// instead. + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding ObserveTargetEvent(UpdateTriggerMode mode) + { + switch (mode) + { + case UpdateTriggerMode.LostFocus: + throw new ArgumentException( + "UpdateTriggerMode.LostFocus is only supported in Android at this time", + "mode"); + + case UpdateTriggerMode.PropertyChanged: + return CheckControlTarget(); + } + + return this; + } + + private Binding CheckControlSource() + { + var textBox = _propertySource.Target as UITextView; + if (textBox != null) + { + var binding = ObserveSourceEvent("Changed"); + binding._sourceHandlers["Changed"].IsDefault = true; + return binding; + } + + var checkbox = _propertySource.Target as UISwitch; + if (checkbox != null) + { + var binding = ObserveSourceEvent("ValueChanged"); + binding._sourceHandlers["ValueChanged"].IsDefault = true; + return binding; + } + + return this; + } + + private Binding CheckControlTarget() + { + if (Mode != BindingMode.TwoWay) + { + return this; + } + + var textBox = _propertyTarget.Target as UITextView; + if (textBox != null) + { + var binding = ObserveTargetEvent("Changed"); + binding._targetHandlers["Changed"].IsDefault = true; + return binding; + } + + var checkbox = _propertyTarget.Target as UISwitch; + if (checkbox != null) + { + var binding = ObserveTargetEvent("ValueChanged"); + binding._targetHandlers["ValueChanged"].IsDefault = true; + return binding; + } + + return this; + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericObsoleteApple.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericObsoleteApple.cs new file mode 100644 index 0000000..59ad1a0 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/BindingGenericObsoleteApple.cs @@ -0,0 +1,93 @@ +// These methods are obsoleted and will be removed in a future version. + +using System; + +namespace GalaSoft.MvvmLight.Helpers +{ + public partial class Binding + { + /// + /// Define that the binding should be evaluated when the bound control's source property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// At this point, this method is inactive on iOS. Use + /// instead. + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding UpdateSourceTrigger() + { + return ObserveSourceEvent(); + } + + /// + /// Define when the binding should be evaluated when the bound source object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// NOTE: At this time the PropertyChanged mode is inactive on iOS. Use + /// instead. + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime binding. Such bindings cannot be updated. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding UpdateSourceTrigger(UpdateTriggerMode mode) + { + return ObserveSourceEvent(mode); + } + + /// + /// Define that the binding should be evaluated when the bound control's target property changes. + /// Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to specify that the binding must be updated when the property changes. + /// + /// At this point, this method is inactive on iOS. Use + /// instead. + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the target object is null or has already been + /// garbage collected before this method is called. + public Binding UpdateTargetTrigger() + { + return ObserveTargetEvent(); + } + + /// + /// Define when the binding should be evaluated when the bound target object + /// is a control. Because Xamarin controls are not DependencyObjects, the + /// bound property will not automatically update the binding attached to it. Instead, + /// use this method to define which of the control's events should be observed. + /// + /// Defines the binding's update mode. Use + /// to update the binding when + /// the source control loses the focus. You can also use + /// to update the binding + /// when the source control's property changes. + /// NOTE: At this time the PropertyChanged mode is inactive on iOS. Use + /// instead. + /// + /// The Binding instance. + /// When this method is called + /// on a OneTime or a OneWay binding. This exception can + /// also be thrown when the source object is null or has already been + /// garbage collected before this method is called. + public Binding UpdateTargetTrigger(UpdateTriggerMode mode) + { + return ObserveTargetEvent(mode); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ExtensionsApple.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ExtensionsApple.cs new file mode 100644 index 0000000..fad5438 --- /dev/null +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ExtensionsApple.cs @@ -0,0 +1,102 @@ +// **************************************************************************** +// +// Copyright © GalaSoft Laurent Bugnion 2009-2016 +// +// **************************************************************************** +// Laurent Bugnion +// laurent@galasoft.ch +// 19.01.2016 +// GalaSoft.MvvmLight +// http://www.mvvmlight.net +// +// See license.txt in this solution or http://www.galasoft.ch/license_MIT.txt +// +// **************************************************************************** + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Foundation; +using UIKit; + +namespace GalaSoft.MvvmLight.Helpers +{ + /// + /// Defines extension methods for iOS only. + /// + ////[ClassInfo(typeof(Binding))] + public static class ExtensionsApple + { + /// + /// Creates a new for a given . + /// + /// The type of the items contained in the collection. + /// The collection that the adapter will be created for. + /// A delegate to a method creating or reusing a . + /// The cell will then be passed to the bindCellDelegate + /// delegate to set the elements' properties. + /// A delegate to a method taking a + /// and setting its elements' properties according to the item + /// passed as second parameter. + /// The cell must be created first in the createCellDelegate + /// delegate. + /// A controller adapted to the collection passed in parameter. + public static ObservableTableViewController GetController( + this ObservableCollection collection, + Func createCellDelegate, + Action bindCellDelegate) + { + return new ObservableTableViewController + { + DataSource = collection, + CreateCellDelegate = createCellDelegate, + BindCellDelegate = bindCellDelegate + }; + } + + /// + /// Creates a new for a given . + /// + /// The type of the items contained in the list. + /// The list that the adapter will be created for. + /// A delegate to a method creating or reusing a . + /// The cell will then be passed to the bindCellDelegate + /// delegate to set the elements' properties. + /// A delegate to a method taking a + /// and setting its elements' properties according to the item + /// passed as second parameter. + /// The cell must be created first in the createCellDelegate + /// delegate. + /// A controller adapted to the collection passed in parameter. + public static ObservableTableViewController GetController( + this IList list, + Func createCellDelegate, + Action bindCellDelegate) + { + return new ObservableTableViewController + { + DataSource = list, + CreateCellDelegate = createCellDelegate, + BindCellDelegate = bindCellDelegate + }; + } + + internal static string GetDefaultEventNameForControl(this Type type) + { + string eventName = null; + + if (type == typeof (UIButton) + || typeof (UIButton).IsAssignableFrom(type)) + { + eventName = "TouchUpInside"; + } + else if (type == typeof (UIBarButtonItem) + || typeof (UIBarButtonItem).IsAssignableFrom(type)) + { + eventName = "Clicked"; + } + + return eventName; + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ObservableTableViewController.cs b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ObservableTableViewController.cs index facff7b..e86d261 100644 --- a/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ObservableTableViewController.cs +++ b/GalaSoft.MvvmLight/GalaSoft.MvvmLight.Platform (iOS)/Helpers/ObservableTableViewController.cs @@ -53,14 +53,8 @@ namespace GalaSoft.MvvmLight.Helpers private bool _loadedView; private Thread _mainThread; private INotifyCollectionChanged _notifier; - private T _selectedItem; private ObservableTableSource _tableSource; - /// - /// Occurs when a new item gets selected in the list. - /// - public event EventHandler SelectionChanged; - /// /// When set, specifies which animation should be used when rows change. /// @@ -186,10 +180,8 @@ namespace GalaSoft.MvvmLight.Helpers /// public T SelectedItem { - get - { - return _selectedItem; - } + get; + private set; } /// @@ -218,16 +210,7 @@ namespace GalaSoft.MvvmLight.Helpers set { base.TableView = value; - - if (_tableSource == null) - { - base.TableView.Source = CreateSource(); - } - else - { - base.TableView.Source = _tableSource; - } - + base.TableView.Source = _tableSource ?? CreateSource(); _loadedView = true; } } @@ -251,11 +234,6 @@ namespace GalaSoft.MvvmLight.Helpers Initialize(); } - /// - /// Occurs when a property of this instance changes. - /// - public event PropertyChangedEventHandler PropertyChanged; - /// /// Overrides the method. /// @@ -320,7 +298,7 @@ namespace GalaSoft.MvvmLight.Helpers /// The NSIndexPath for the selected row. protected virtual void OnRowSelected(object item, NSIndexPath indexPath) { - _selectedItem = (T)item; + SelectedItem = (T)item; // ReSharper disable ExplicitCallerInfoArgument RaisePropertyChanged(SelectedItemPropertyName); @@ -403,6 +381,16 @@ namespace GalaSoft.MvvmLight.Helpers DeleteAnimation = UITableViewRowAnimation.Automatic; } + /// + /// Occurs when a property of this instance changes. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Occurs when a new item gets selected in the list. + /// + public event EventHandler SelectionChanged; + /// /// A that handles changes to the underlying /// data source if this data source is an . diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Assets/AboutAssets.txt b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Assets/AboutAssets.txt new file mode 100644 index 0000000..72f5729 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Assets/AboutAssets.txt @@ -0,0 +1,19 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories) and given a Build Action of "AndroidAsset". + +These files will be deployed with you package and will be accessible using Android's +AssetManager, like this: + +public class ReadAsset : Activity +{ + protected override void OnCreate (Bundle bundle) + { + base.OnCreate (bundle); + + InputStream input = Assets.Open ("my_asset.txt"); + } +} + +Additionally, some Android functions will automatically load asset files: + +Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/BindingTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/BindingTest.cs new file mode 100644 index 0000000..dff9d2e --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/BindingTest.cs @@ -0,0 +1,261 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class BindingTest + { + private Binding _binding; + + public TestViewModel VmSource + { + get; + private set; + } + + public TestViewModel VmTarget + { + get; + private set; + } + + [Test] + public void Binding_ConverterWithFallbackValue_ErrorInConverterShouldUseFallbackValue() + { + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = "Initial value" + } + }; + + var vmTarget = new TestViewModel(); + + const string fallbackValue = "Fallback value"; + const string targetNullValue = "Target null value"; + + _binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty, + vmTarget, + () => vmTarget.TargetProperty, + BindingMode.Default, + fallbackValue, + targetNullValue) + .ConvertSourceToTarget( + value => + { + throw new InvalidCastException("Only for test"); + }); + + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + + vmSource.Model.MyProperty = "New value"; + + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + } + + [Test] + public void Binding_MultipleLevelsOfNull_ShouldUseFallbackValueThenTargetNullValue() + { + var vmSource = new TestViewModel(); + var vmTarget = new TestViewModel(); + + const string fallbackValue = "Fallback value"; + const string targetNullValue = "Target null value"; + + _binding = new Binding( + vmSource, + () => vmSource.Nested.Model.MyProperty, + vmTarget, + () => vmTarget.TargetProperty, + BindingMode.Default, + fallbackValue, + targetNullValue); + + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + vmSource.Nested = new TestViewModel(); + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + vmSource.Nested.Model = new TestModel(); + Assert.AreEqual(targetNullValue, vmTarget.TargetProperty); + vmSource.Nested.Model.MyProperty = DateTime.Now.Ticks.ToString(); + Assert.AreEqual(vmSource.Nested.Model.MyProperty, vmTarget.TargetProperty); + } + + [Test] + public void + Binding_MultipleLevelsOfNullWithConverter_ShouldCallConverterWithNullThenTargetNullValueButNotFallbackValue( + + ) + { + var vmSource = new TestViewModel(); + var vmTarget = new TestViewModel(); + + const string fallbackValue = "Fallback value"; + const string targetNullValue = "Target null value"; + const string suffix = "Suffix"; + var converterWasCalledWithNull = 0; + var converterWasCalledWithTargetNullValue = 0; + var converterWasCalledWithFallbackValue = 0; + + _binding = new Binding( + vmSource, + () => vmSource.Nested.Model.MyProperty, + vmTarget, + () => vmTarget.TargetProperty, + BindingMode.Default, + fallbackValue, + targetNullValue) + .ConvertSourceToTarget( + v => + { + if (v == null) + { + converterWasCalledWithNull++; + return null; + } + + switch (v) + { + case fallbackValue: + converterWasCalledWithFallbackValue++; + break; + + case targetNullValue: + converterWasCalledWithTargetNullValue++; + break; + } + + return v + suffix; + }); + + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + Assert.AreEqual(0, converterWasCalledWithNull); + Assert.AreEqual(0, converterWasCalledWithFallbackValue); + Assert.AreEqual(0, converterWasCalledWithTargetNullValue); + + vmSource.Nested = new TestViewModel(); + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + Assert.AreEqual(0, converterWasCalledWithNull); + Assert.AreEqual(0, converterWasCalledWithFallbackValue); + Assert.AreEqual(0, converterWasCalledWithTargetNullValue); + + vmSource.Nested.Model = new TestModel(); + Assert.AreEqual(targetNullValue + suffix, vmTarget.TargetProperty); + Assert.AreEqual(1, converterWasCalledWithNull); + Assert.AreEqual(0, converterWasCalledWithFallbackValue); + Assert.AreEqual(1, converterWasCalledWithTargetNullValue); + + vmSource.Nested.Model.MyProperty = DateTime.Now.Ticks.ToString(); + Assert.AreEqual(vmSource.Nested.Model.MyProperty + suffix, vmTarget.TargetProperty); + Assert.AreEqual(1, converterWasCalledWithNull); + Assert.AreEqual(0, converterWasCalledWithFallbackValue); + Assert.AreEqual(1, converterWasCalledWithTargetNullValue); + } + + [Test] + public void Binding_NoErrors_ShouldUpdateTargetValue() + { + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = "Hello world" + } + }; + + var vmTarget = new TestViewModel(); + + _binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty, + vmTarget, + () => vmTarget.TargetProperty); + + Assert.AreEqual(vmSource.Model.MyProperty, vmTarget.TargetProperty); + var newValue = DateTime.Now.Ticks.ToString(); + vmSource.Model.MyProperty = newValue; + Assert.AreEqual(vmSource.Model.MyProperty, vmTarget.TargetProperty); + } + + [Test] + public void Binding_NullSourceProperty_ShouldUseTargetNullValue() + { + var vmSource = new TestViewModel() + { + Model = new TestModel() + }; + + var vmTarget = new TestViewModel(); + + const string fallbackValue = "Fallback value"; + const string targetNullValue = "Target null value"; + + _binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty, + vmTarget, + () => vmTarget.TargetProperty, + BindingMode.Default, + fallbackValue, + targetNullValue); + + Assert.AreEqual(targetNullValue, vmTarget.TargetProperty); + vmSource.Model.MyProperty = DateTime.Now.Ticks.ToString(); + Assert.AreEqual(vmSource.Model.MyProperty, vmTarget.TargetProperty); + } + + [Test] + public void Binding_ObjectCreation_ShouldAttachOnDemand() + { + VmSource = new TestViewModel(); + VmTarget = new TestViewModel(); + + _binding = this.SetBinding( + () => VmSource.Model.MyProperty, + () => VmTarget.TargetProperty); + + Assert.IsNull(VmTarget.TargetProperty); + VmSource.Model = new TestModel(); + Assert.IsNull(VmTarget.TargetProperty); + VmSource.Model.MyProperty = DateTime.Now.Ticks.ToString(); + Assert.AreEqual(VmSource.Model.MyProperty, VmTarget.TargetProperty); + VmSource.Model.MyProperty = "Another value"; + Assert.AreEqual(VmSource.Model.MyProperty, VmTarget.TargetProperty); + } + + [Test] + public void Binding_OneLevelOfNull_ShouldUseFallbackValue() + { + var vmSource = new TestViewModel(); + var vmTarget = new TestViewModel(); + + const string fallbackValue = "Fallback value"; + const string targetNullValue = "Target null value"; + + _binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty, + vmTarget, + () => vmTarget.TargetProperty, + BindingMode.Default, + fallbackValue, + targetNullValue); + + Assert.AreEqual(fallbackValue, vmTarget.TargetProperty); + + vmSource.Model = new TestModel + { + MyProperty = DateTime.Now.Ticks.ToString() + }; + + Assert.AreEqual(vmSource.Model.MyProperty, vmTarget.TargetProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventImplicitTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventImplicitTest.cs new file mode 100644 index 0000000..cf66f18 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventImplicitTest.cs @@ -0,0 +1,404 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventImplicitTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventLostFocusTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventLostFocusTest.cs new file mode 100644 index 0000000..22b5f5c --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventLostFocusTest.cs @@ -0,0 +1,404 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventLostFocusTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .ObserveSourceEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .ObserveSourceEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.IsTrue(control2.Checked); + Assert.AreEqual("True", control1.Text); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.AreEqual("True", vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .ObserveSourceEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + control1.ClearFocus(); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent() // LostFocus doesn't work programatically with CheckBoxes + .ObserveTargetEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.RequestFocus(); + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent() // LostFocus doesn't work programatically with CheckBoxes + .ObserveTargetEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.IsTrue(control2.Checked); + Assert.AreEqual("True", control1.Text); + + var value = "False"; + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + control1.ClearFocus(); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.AreEqual("True", vm.Model.MyProperty); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.LostFocus) + .ObserveTargetEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + control1.ClearFocus(); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.LostFocus) + .ObserveTargetEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, control2.Text); + + var newValue = value + "Suffix"; + control2.RequestFocus(); + control2.Text = newValue; + Assert.AreEqual(newValue, control2.Text); + Assert.AreEqual(value, control1.Text); + control2.ClearFocus(); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .ObserveTargetEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.RequestFocus(); + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + var newValue = value + "Suffix"; + control1.RequestFocus(); + control1.Text = newValue; + Assert.AreEqual(newValue, control1.Text); + Assert.AreEqual(value, vm.Model.MyProperty); + control1.ClearFocus(); + Assert.AreEqual(newValue, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNoArgumentTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNoArgumentTest.cs new file mode 100644 index 0000000..495b61f --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNoArgumentTest.cs @@ -0,0 +1,375 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventNoArgumentTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .ObserveSourceEvent(); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .ObserveSourceEvent(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .ObserveTargetEvent(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNonDefaultEventTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNonDefaultEventTest.cs new file mode 100644 index 0000000..b09217a --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventNonDefaultEventTest.cs @@ -0,0 +1,70 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Views; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventNonDefaultEventTest + { + [Test] + public void Binding_OneWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent("LongClick"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.PerformLongClick(); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent("LongClick") + .ObserveTargetEvent("LongClick"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.PerformLongClick(); + Assert.AreEqual(control1.Text, control2.Text); + + var newValue = value + "Suffix"; + control2.Text = newValue; + Assert.AreEqual(newValue, control2.Text); + Assert.AreEqual(value, control1.Text); + control2.PerformLongClick(); + Assert.AreEqual(control2.Text, control1.Text); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventPropertyChangedTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventPropertyChangedTest.cs new file mode 100644 index 0000000..3796f52 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventPropertyChangedTest.cs @@ -0,0 +1,375 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventPropertyChangedTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventTest.cs new file mode 100644 index 0000000..1c14b0c --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/ObserveEventTest.cs @@ -0,0 +1,423 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Text; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .ObserveSourceEvent("CheckedChange"); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .ObserveSourceEvent("CheckedChange"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent("CheckedChange"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .ObserveSourceEvent("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent("CheckedChange") + .ObserveTargetEvent("CheckedChange"); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent("CheckedChange") + .ObserveTargetEvent("TextChanged"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent("CheckedChange"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .ObserveSourceEvent("TextChanged") + .ObserveTargetEvent("CheckedChange"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithObserveEvent_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent("TextChanged") + .ObserveTargetEvent("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .ObserveTargetEvent("CheckedChange"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithObserveEvent_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent("TextChanged"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/SetCommandTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/SetCommandTest.cs new file mode 100644 index 0000000..12e2a17 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/SetCommandTest.cs @@ -0,0 +1,389 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class SetCommandTest + { + [Test] + public void SetCommand_OnButtonExWithSimpleValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var button = new ButtonEx(Application.Context); + + button.SetCommand( + "Click", + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonExWithSimpleValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var button = new ButtonEx(Application.Context); + + button.SetCommand( + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonNoValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var button = new Button(Application.Context); + + button.SetCommand("Click", vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonNoValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var button = new Button(Application.Context); + + button.SetCommand(vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithBinding_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var button = new Button(Application.Context); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + button.SetCommand( + "Click", + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithBindingNoEventName_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var button = new Button(Application.Context); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + button.SetCommand( + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithSimpleValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var button = new Button(Application.Context); + + button.SetCommand( + "Click", + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithSimpleValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var button = new Button(Application.Context); + + button.SetCommand( + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + button.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnCheckBoxNoValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var checkBox = new CheckBox(Application.Context); + + checkBox.SetCommand( + "CheckedChange", + vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnCheckBoxNoValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var checkBox = new CheckBox(Application.Context); + + checkBox.SetCommand(vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnCheckBoxWithBinding_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var checkBox = new CheckBox(Application.Context); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + checkBox.SetCommand( + "CheckedChange", + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnCheckBoxWithBindingNoEventName_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var checkBox = new CheckBox(Application.Context); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + checkBox.SetCommand( + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnCheckBoxWithSimpleValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var checkBox = new CheckBox(Application.Context); + + checkBox.SetCommand( + "CheckedChange", + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnCheckBoxWithSimpleValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var checkBox = new CheckBox(Application.Context); + + checkBox.SetCommand( + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + checkBox.PerformClick(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_WithICommandOnButtonNoValue_NoError() + { + var vmTarget = new TestViewModel(); + var button = new Button(Application.Context); + + button.SetCommand("Click", vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + button.PerformClick(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + [Test] + public void SetCommand_WithICommandOnButtonNoValueNoEventName_ClickEventShouldBeUsed() + { + var vmTarget = new TestViewModel(); + var button = new Button(Application.Context); + + button.SetCommand(vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + button.PerformClick(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + [Test] + public void SetCommand_WithICommandOnCheckBoxNoValue_NoError() + { + var vmTarget = new TestViewModel(); + var checkBox = new CheckBox(Application.Context); + + checkBox.SetCommand("CheckedChange", vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + checkBox.PerformClick(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + [Test] + public void SetCommand_WithICommandOnCheckBoxNoValueNoEventName_ClickEventShouldBeUsed() + { + var vmTarget = new TestViewModel(); + var checkBox = new CheckBox(Application.Context); + + checkBox.SetCommand(vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + checkBox.PerformClick(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerImplicitTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerImplicitTest.cs new file mode 100644 index 0000000..121e3ed --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerImplicitTest.cs @@ -0,0 +1,404 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerImplicitTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerLostFocusTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerLostFocusTest.cs new file mode 100644 index 0000000..ca156e6 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerLostFocusTest.cs @@ -0,0 +1,404 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerLostFocusTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .UpdateSourceTrigger(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .UpdateSourceTrigger(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.IsTrue(control2.Checked); + Assert.AreEqual("True", control1.Text); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.AreEqual("True", vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .UpdateSourceTrigger(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + control1.ClearFocus(); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger() // LostFocus doesn't work programatically with CheckBoxes + .ObserveTargetEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.RequestFocus(); + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger() // LostFocus doesn't work programatically with CheckBoxes + .ObserveTargetEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.IsTrue(control2.Checked); + Assert.AreEqual("True", control1.Text); + + var value = "False"; + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + control1.ClearFocus(); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.AreEqual("True", vm.Model.MyProperty); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.LostFocus) + .ObserveTargetEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + control1.ClearFocus(); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.LostFocus) + .ObserveTargetEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, control2.Text); + + var newValue = value + "Suffix"; + control2.RequestFocus(); + control2.Text = newValue; + Assert.AreEqual(newValue, control2.Text); + Assert.AreEqual(value, control1.Text); + control2.ClearFocus(); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.RequestFocus(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, vm.Model.MyProperty); + control1.ClearFocus(); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .ObserveTargetEvent(); // LostFocus doesn't work programatically with CheckBoxes + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.RequestFocus(); + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(UpdateTriggerMode.LostFocus); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + var newValue = value + "Suffix"; + control1.RequestFocus(); + control1.Text = newValue; + Assert.AreEqual(newValue, control1.Text); + Assert.AreEqual(value, vm.Model.MyProperty); + control1.ClearFocus(); + Assert.AreEqual(newValue, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNoArgumentTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNoArgumentTest.cs new file mode 100644 index 0000000..9d48231 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNoArgumentTest.cs @@ -0,0 +1,375 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerNoArgumentTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .UpdateSourceTrigger(); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .UpdateSourceTrigger(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .ObserveTargetEvent(); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .ObserveTargetEvent(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .ObserveTargetEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .ObserveTargetEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .ObserveTargetEvent(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNonDefaultEventTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNonDefaultEventTest.cs new file mode 100644 index 0000000..48337d9 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerNonDefaultEventTest.cs @@ -0,0 +1,70 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Views; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerNonDefaultEventTest + { + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger("LongClick"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.PerformLongClick(); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger("LongClick") + .ObserveTargetEvent("LongClick"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(string.Empty, control2.Text); + control1.PerformLongClick(); + Assert.AreEqual(control1.Text, control2.Text); + + var newValue = value + "Suffix"; + control2.Text = newValue; + Assert.AreEqual(newValue, control2.Text); + Assert.AreEqual(value, control1.Text); + control2.PerformLongClick(); + Assert.AreEqual(control2.Text, control1.Text); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerPropertyChangedTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerPropertyChangedTest.cs new file mode 100644 index 0000000..ed0d1f5 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerPropertyChangedTest.cs @@ -0,0 +1,375 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerPropertyChangedTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerTest.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerTest.cs new file mode 100644 index 0000000..eac2fd2 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Binding/UpdateTriggerTest.cs @@ -0,0 +1,423 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Android.App; +using Android.Text; +using Android.Widget; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked) + .UpdateSourceTrigger("CheckedChange"); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text) + .UpdateSourceTrigger("CheckedChange"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger("CheckedChange"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked) + .UpdateSourceTrigger("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new CheckBox(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger("CheckedChange") + .UpdateTargetTrigger("CheckedChange"); + + Assert.IsFalse(control1.Checked); + Assert.IsFalse(control2.Checked); + control1.Checked = true; + Assert.IsTrue(control1.Checked); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control2, + () => control2.Checked, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger("CheckedChange") + .UpdateTargetTrigger("TextChanged"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.Checked); + control2.Checked = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.Checked); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.Checked); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Checked, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger("CheckedChange"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + control1.Checked = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new CheckBox(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Checked, + BindingMode.TwoWay) + .UpdateSourceTrigger("TextChanged") + .UpdateTargetTrigger("CheckedChange"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.Checked); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.Checked); + + control2.Checked = false; + Assert.IsFalse(control2.Checked); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new EditText(Application.Context); + var control2 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger("TextChanged") + .UpdateTargetTrigger("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger("TextChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new CheckBox(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Checked, + BindingMode.TwoWay) + .UpdateTargetTrigger("CheckedChange"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.Checked); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.Checked); + + control1.Checked = false; + Assert.IsFalse(control1.Checked); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new EditText(Application.Context); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateTargetTrigger("TextChanged"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Controls/ButtonEx.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Controls/ButtonEx.cs new file mode 100644 index 0000000..28a2227 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Controls/ButtonEx.cs @@ -0,0 +1,41 @@ +using System; +using Android.Content; +using Android.Runtime; +using Android.Util; +using Android.Widget; + +namespace GalaSoft.MvvmLight.Test.Controls +{ + public class ButtonEx : Button + { + public ButtonEx(IntPtr javaReference, JniHandleOwnership transfer) + : base(javaReference, transfer) + { + } + + public ButtonEx(Context context) + : base(context) + { + } + + public ButtonEx(Context context, IAttributeSet attrs) + : base(context, attrs) + { + } + + public ButtonEx(Context context, IAttributeSet attrs, int defStyleAttr) + : base(context, attrs, defStyleAttr) + { + } + + public ButtonEx(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) + : base(context, attrs, defStyleAttr, defStyleRes) + { + } + + public void TestClick() + { + PerformClick(); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/GalaSoft.MvvmLight.Test (Android).csproj b/GalaSoft.MvvmLight/Tests/AndroidTestApp/GalaSoft.MvvmLight.Test (Android).csproj new file mode 100644 index 0000000..495d83d --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/GalaSoft.MvvmLight.Test (Android).csproj @@ -0,0 +1,141 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {7141046B-7E7F-4D20-9F84-D2A65A9FA2CA} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + GalaSoft.MvvmLight.Test + UnitTestApp1 + 512 + true + Resources\Resource.Designer.cs + Off + True + v6.0 + Properties\AndroidManifest.xml + + + true + full + false + bin\Debug\ + TRACE;DEBUG;ANDROID + prompt + 4 + True + None + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + False + SdkOnly + + + + + + + + + + + + Helpers\Binding.cs + + + Helpers\BindingGeneric.cs + + + Helpers\BindingGenericAndroid.cs + + + Helpers\BindingGenericObsolete.cs + + + Helpers\BindingGenericObsoleteAndroid.cs + + + Helpers\BindingMode.cs + + + Helpers\Extensions.cs + + + Helpers\ExtensionsAndroid.cs + + + Helpers\IWeakEventListener.cs + + + Helpers\ObservableAdapter.cs + + + Helpers\PropertyChangedEventManager.cs + + + Helpers\UpdateSourceTriggerMode.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {6a912701-3ba1-4975-adbf-160caf66b640} + GalaSoft.MvvmLight %28PCL%29 + + + {39c71a69-4ace-4b45-9a2c-c274fada78ef} + GalaSoft.MvvmLight.Extras %28PCL%29 + + + + + \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/MainActivity.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/MainActivity.cs new file mode 100644 index 0000000..fe26833 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/MainActivity.cs @@ -0,0 +1,23 @@ +using System.Reflection; +using Android.App; +using Android.OS; +using Xamarin.Android.NUnitLite; + +namespace GalaSoft.MvvmLight.Test +{ + [Activity(Label = "AndroidTestApp", MainLauncher = true, Icon = "@drawable/icon")] + public class MainActivity : TestSuiteActivity + { + protected override void OnCreate(Bundle bundle) + { + // tests can be inside the main assembly + AddTest(Assembly.GetExecutingAssembly()); + // or in any reference assemblies + // AddTest (typeof (Your.Library.TestClass).Assembly); + + // Once you called base.OnCreate(), you cannot add more assemblies. + base.OnCreate(bundle); + } + } +} + diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AndroidManifest.xml b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AndroidManifest.xml new file mode 100644 index 0000000..d193dc9 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AssemblyInfo.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..02d928b --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Android.App; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UnitTestApp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnitTestApp1")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/AboutResources.txt b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/AboutResources.txt new file mode 100644 index 0000000..4cedede --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/Resource.Designer.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/Resource.Designer.cs new file mode 100644 index 0000000..84f0738 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/Resource.Designer.cs @@ -0,0 +1,194 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::Android.Runtime.ResourceDesignerAttribute("GalaSoft.MvvmLight.Test.Resource", IsApplication=true)] + +namespace GalaSoft.MvvmLight.Test +{ + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] + public partial class Resource + { + + static Resource() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + public static void UpdateIdValues() + { + global::Xamarin.Android.NUnitLite.Resource.Id.OptionHostName = global::GalaSoft.MvvmLight.Test.Resource.Id.OptionHostName; + global::Xamarin.Android.NUnitLite.Resource.Id.OptionPort = global::GalaSoft.MvvmLight.Test.Resource.Id.OptionPort; + global::Xamarin.Android.NUnitLite.Resource.Id.OptionRemoteServer = global::GalaSoft.MvvmLight.Test.Resource.Id.OptionRemoteServer; + global::Xamarin.Android.NUnitLite.Resource.Id.OptionsButton = global::GalaSoft.MvvmLight.Test.Resource.Id.OptionsButton; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultFullName = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultFullName; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultMessage = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultMessage; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultResultState = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultResultState; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultRunSingleMethodTest = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultRunSingleMethodTest; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultStackTrace = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultStackTrace; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsFailed = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsFailed; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsId = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsId; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsIgnored = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsIgnored; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsInconclusive = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsInconclusive; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsMessage = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsMessage; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsPassed = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsPassed; + global::Xamarin.Android.NUnitLite.Resource.Id.ResultsResult = global::GalaSoft.MvvmLight.Test.Resource.Id.ResultsResult; + global::Xamarin.Android.NUnitLite.Resource.Id.RunTestsButton = global::GalaSoft.MvvmLight.Test.Resource.Id.RunTestsButton; + global::Xamarin.Android.NUnitLite.Resource.Id.TestSuiteListView = global::GalaSoft.MvvmLight.Test.Resource.Id.TestSuiteListView; + global::Xamarin.Android.NUnitLite.Resource.Layout.options = global::GalaSoft.MvvmLight.Test.Resource.Layout.options; + global::Xamarin.Android.NUnitLite.Resource.Layout.results = global::GalaSoft.MvvmLight.Test.Resource.Layout.results; + global::Xamarin.Android.NUnitLite.Resource.Layout.test_result = global::GalaSoft.MvvmLight.Test.Resource.Layout.test_result; + global::Xamarin.Android.NUnitLite.Resource.Layout.test_suite = global::GalaSoft.MvvmLight.Test.Resource.Layout.test_suite; + } + + public partial class Attribute + { + + static Attribute() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Attribute() + { + } + } + + public partial class Drawable + { + + // aapt resource value: 0x7f020000 + public const int Icon = 2130837504; + + static Drawable() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Drawable() + { + } + } + + public partial class Id + { + + // aapt resource value: 0x7f050001 + public const int OptionHostName = 2131034113; + + // aapt resource value: 0x7f050002 + public const int OptionPort = 2131034114; + + // aapt resource value: 0x7f050000 + public const int OptionRemoteServer = 2131034112; + + // aapt resource value: 0x7f050010 + public const int OptionsButton = 2131034128; + + // aapt resource value: 0x7f05000b + public const int ResultFullName = 2131034123; + + // aapt resource value: 0x7f05000d + public const int ResultMessage = 2131034125; + + // aapt resource value: 0x7f05000c + public const int ResultResultState = 2131034124; + + // aapt resource value: 0x7f05000a + public const int ResultRunSingleMethodTest = 2131034122; + + // aapt resource value: 0x7f05000e + public const int ResultStackTrace = 2131034126; + + // aapt resource value: 0x7f050006 + public const int ResultsFailed = 2131034118; + + // aapt resource value: 0x7f050003 + public const int ResultsId = 2131034115; + + // aapt resource value: 0x7f050007 + public const int ResultsIgnored = 2131034119; + + // aapt resource value: 0x7f050008 + public const int ResultsInconclusive = 2131034120; + + // aapt resource value: 0x7f050009 + public const int ResultsMessage = 2131034121; + + // aapt resource value: 0x7f050005 + public const int ResultsPassed = 2131034117; + + // aapt resource value: 0x7f050004 + public const int ResultsResult = 2131034116; + + // aapt resource value: 0x7f05000f + public const int RunTestsButton = 2131034127; + + // aapt resource value: 0x7f050011 + public const int TestSuiteListView = 2131034129; + + static Id() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Id() + { + } + } + + public partial class Layout + { + + // aapt resource value: 0x7f030000 + public const int options = 2130903040; + + // aapt resource value: 0x7f030001 + public const int results = 2130903041; + + // aapt resource value: 0x7f030002 + public const int test_result = 2130903042; + + // aapt resource value: 0x7f030003 + public const int test_suite = 2130903043; + + static Layout() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Layout() + { + } + } + + public partial class String + { + + // aapt resource value: 0x7f040001 + public const int ApplicationName = 2130968577; + + // aapt resource value: 0x7f040000 + public const int Hello = 2130968576; + + static String() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private String() + { + } + } + } +} +#pragma warning restore 1591 diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/drawable/Icon.png b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/drawable/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 zcmV-35X|q1P)OwvMs$Q8_8nISM!^>PxsujeDCl4&hPxrxkp%Qc^^|l zp6LqAcf3zf1H4aA1Gv-O6ha)ktct9Y+VA@N^9i;p0H%6v>ZJZYQ`zEa396z-gi{r_ zDz)D=vgRv62GCVeRjK{15j7V@v6|2nafFX6W7z2j1_T0a zLyT3pGTubf1lB5)32>bl0*BflrA!$|_(WD2)iJIfV}37=ZKAC zSe3boYtQ=;o0i>)RtBvsI#iT{0!oF1VFeW`jDjF2Q4aE?{pGCAd>o8Kg#neIh*AMY zLl{;F!vLiem7s*x0<9FKAd6LoPz3~G32P+F+cuGOJ5gcC@pU_?C2fmix7g2)SUaQO$NS07~H)#fn!Q<}KQWtX}wW`g2>cMld+`7Rxgq zChaey66SG560JhO66zA!;sK1cWa2AG$9k~VQY??6bOmJsw9@3uL*z;WWa7(Nm{^TA zilc?y#N9O3LcTo2c)6d}SQl-v-pE4^#wb=s(RxaE28f3FQW(yp$ulG9{KcQ7r>7mQ zE!HYxUYex~*7IinL+l*>HR*UaD;HkQhkL(5I@UwN%Wz504M^d!ylo>ANvKPF_TvA< zkugG5;F6x}$s~J8cnev->_(Ic7%lGQgUi3n#XVo36lUpcS9s z)ympRr7}@|6WF)Ae;D{owN1;aZSR50al9h~?-WhbtKK%bDd zhML131oi1Bu1&Qb$Cp199LJ#;j5d|FhW8_i4KO1OI>}J^p2DfreMSVGY9aFlr&90t zyI2FvxQiKMFviSQeP$Ixh#70qj5O%I+O_I2t2XHWqmh2!1~tHpN3kA4n=1iHj?`@c<~3q^X6_Q$AqTDjBU`|!y<&lkqL|m5tG(b z8a!z&j^m(|;?SW(l*?tZ*{m2H9d&3jqBtXh>O-5e4Qp-W*a5=2NL&Oi62BUM)>zE3 zbSHb>aU3d@3cGggA`C-PsT9^)oy}%dHCaO~nwOrm5E54=aDg(&HR4S23Oa#-a^=}w%g?ZP-1iq8PSjE8jYaGZu z$I)?YN8he?F9>)2d$G6a*zm0XB*Rf&gZAjq(8l@CUDSY1tB#!i> zW$VfG%#SYSiZ};)>pHA`qlfDTEYQEwN6>NNEp+uxuqx({Fgr zjI@!4xRc?vk^9+~eU|mzH__dCDI=xb{Cd}4bELS9xRaS!*FXMwtMR-RR%SLMh0Cjl zencr8#Su<4(%}$yGVBU-HX{18v=yPH*+%^Vtknc>2A;%-~DrYFx^3XfuVgvZ{#1tA== zm3>IzAM2{3Iv_d1XG{P6^tN3|PkJMnjs&CWN7%7_CmjoVakUhsa&dMv==2~^ri?&x zVdv*rnfVyM+I1^Kg*S=23mR@+0T9BWFZUu~@toA8d)fw6be=`Yb6DSX6D?jB%2YT~ z*aHjtIOozfMhA!Jd*?u5_n!SnX>vX`=Ti-1HA4RiE>eI3vTn zz+>Ccf0HX6Ans-ebOB>RJST-Cyr#4XAk+mAlJgdQnoE{^iIN)OcYFSpgJUmXtl@tT z-^ZuUeSj5hSFrQwqX>~EtZ*{>Gi8Bu9_|o06oNtaXP?E936!a@DsvS*tsB@fa6kEA z5GkjwmH?EgpiG&itsB_Tb1NxtFnvxh_s@9KYX1Sttf?AlI~)z zT=6Y7ulx=}<8Scr_UqU-_z)5gPo%050PsbM*ZLno;_-ow&k?FZJtYmb2hPA$LkP)8 z=^d0Q6PImh6Y|QT?{grxj)S=uBKvY2EQUbm@ns9^yKiP~$DcD)c$5Em`zDSScH%iH zVov&m=cMo`1tYwA=!a}vb_ef_{)Q2?FUqn>BR$6phXQRv^1%=YfyE-F$AR4Q?9D!f zCzB^^#td~4u&l~l#rp2QLfe3+_ub9@+|x+m;=2(sQ`s%gO|j$XBb>A7Q(UydipiMw%igcweV#Cr~SP);q>w`bxts_4} znKHg?X==JDkQl3Y>Ckt%`s{n?Nq-1Fw5~%Mq$CAsi-`yu_bKm zxs#QdE7&vgJD%M84f4SNzSDv)S|V?|$!d5a#lhT5>>YWE4NGqa9-fbmV$=)@k&32kdEYetna>=j@0>V8+wRsL;po!3ivVwh<9tn z2S<1u9DAAQ>x1Sn=fk`)At|quvleV($B|#Kap_lB-F^*yV=wZ{9baUu(uXfokr95^ zA*!*W=5a>$2Ps`-F^+qRQT^{*cN>vipT*4!r#p%{(#I7s z0NN94*q?ib$KJjfDI_sjHNdmEVp5wB&j54O#VoFqBwy)gfA$%)4d_X4q${L9Xom2R3xy&ZBSNgt4a1d7K^CDWa9r zVb-_52m}Vp)`9;ZSKd#|U4ZYj5}Gp49{4utST|=c`~(#>KHF6}CCov1iHYw zt{bWo)A@yF2$~c(nR$rSAaFQ$(Wh{vkG1AlutDMw=mM`C`T=X&|Ad9fb5Od}ROt1z zOpczHqrb4Jo^rSCiW#&o(m7jFamnrsTpQb;*h4o8r#$aZ}2RaT-x2u^^ z%u@YyIv$U^u~@9(XGbSwU@fk6SikH>j+D1jQrYTKGJpW%vUT{!d}7THI5&Sa?~MKy zS0-mvMl+BOcroEJ@hN!2H_?coTEJ5Q<;Nd?yx;eIj4{$$E2?YUO|NtNPJ-PdDf;s} zab;}Mz0kbOI}5*w@3gROcnl#5)wQnEhDBfn!Xhy`u>C}*E~vWpO^HS)FC>8^umI=+ z&H;LW6w#;EF`}vQd_9Muru`KnQVPI9U?(sD)&Dg-0j3#(!fNKVZ_GoYH{la~d*1Yh$TI-TL>mI4vpNb@sU2=IZ8vL%AXUx0 zz{K0|nK(yizLHaeW#ZhRfQXoK^}1$=$#1{Yn002ovPDHLkV1n#w+^+xt literal 0 HcmV?d00001 diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/values/Strings.xml b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/values/Strings.xml new file mode 100644 index 0000000..76b144e --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/Resources/values/Strings.xml @@ -0,0 +1,5 @@ + + + Hello World, Click Me! + UnitTestApp1 + diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/CommandImpl.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/CommandImpl.cs new file mode 100644 index 0000000..dbf50c4 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/CommandImpl.cs @@ -0,0 +1,33 @@ +using System; +using System.Windows.Input; + +namespace GalaSoft.MvvmLight.Test.ViewModel +{ + public class CommandImpl : ICommand + { + private readonly string _initialValue; + + public string Parameter + { + get; + private set; + } + + public CommandImpl(string initialValue) + { + _initialValue = initialValue; + } + + public bool CanExecute(object parameter) + { + return true; + } + + public void Execute(object parameter) + { + Parameter = _initialValue; + } + + public event EventHandler CanExecuteChanged; + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestModel.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestModel.cs new file mode 100644 index 0000000..3b1526f --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestModel.cs @@ -0,0 +1,19 @@ +namespace GalaSoft.MvvmLight.Test.ViewModel +{ + public class TestModel : ObservableObject + { + private string _myProperty; + + public string MyProperty + { + get + { + return _myProperty; + } + set + { + Set(ref _myProperty, value); + } + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestViewModel.cs b/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestViewModel.cs new file mode 100644 index 0000000..887a42e --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AndroidTestApp/ViewModel/TestViewModel.cs @@ -0,0 +1,86 @@ +using System.Windows.Input; +using GalaSoft.MvvmLight.Command; + +namespace GalaSoft.MvvmLight.Test.ViewModel +{ + public class TestViewModel : ViewModelBase + { + public const string ValueForCommand = "Command value"; + private TestModel _model; + private TestViewModel _nested; + private string _propertyValue; + private RelayCommand _setPropertyCommand; + private RelayCommand _setPropertyWithoutValueCommand; + private ICommand _testCommandImpl; + + public TestModel Model + { + get + { + return _model; + } + set + { + Set(ref _model, value); + } + } + + public TestViewModel Nested + { + get + { + return _nested; + } + set + { + Set(ref _nested, value); + } + } + + public RelayCommand SetPropertyCommand + { + get + { + return _setPropertyCommand + ?? (_setPropertyCommand = new RelayCommand( + p => + { + TargetProperty = p; + })); + } + } + + public RelayCommand SetPropertyWithoutValueCommand + { + get + { + return _setPropertyWithoutValueCommand + ?? (_setPropertyWithoutValueCommand = new RelayCommand( + () => + { + TargetProperty = _propertyValue; + })); + } + } + + public string TargetProperty + { + get; + set; + } + + public ICommand TestCommandImpl + { + get + { + return _testCommandImpl + ?? (_testCommandImpl = new CommandImpl(ValueForCommand)); + } + } + + public void Configure(string propertyValue) + { + _propertyValue = propertyValue; + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/AppDelegate.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/AppDelegate.cs new file mode 100644 index 0000000..9e3695b --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/AppDelegate.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using Foundation; +using MonoTouch.NUnit.UI; +using UIKit; + +namespace GalaSoft.MvvmLight.Test +{ + [Register("AppDelegate")] + public class AppDelegate : UIApplicationDelegate + { + private TouchRunner _runner; + + public override UIWindow Window + { + get; + set; + } + + public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) + { + Window = new UIWindow(UIScreen.MainScreen.Bounds); + _runner = new TouchRunner(Window); + + // register every tests included in the main application/assembly + _runner.Add(Assembly.GetExecutingAssembly()); + + Window.RootViewController = new UINavigationController(_runner.GetViewController()); + + // make the window visible + Window.MakeKeyAndVisible(); + + return true; + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventImplicitTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventImplicitTest.cs new file mode 100644 index 0000000..3cb82b4 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventImplicitTest.cs @@ -0,0 +1,403 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventImplicitTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventNoArgumentTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventNoArgumentTest.cs new file mode 100644 index 0000000..e93c7c4 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventNoArgumentTest.cs @@ -0,0 +1,421 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventNoArgumentTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On) + .ObserveSourceEvent(); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text) + .ObserveSourceEvent(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent() + .ObserveTargetEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay) + .ObserveTargetEvent(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventPropertyChangedTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventPropertyChangedTest.cs new file mode 100644 index 0000000..85faf33 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventPropertyChangedTest.cs @@ -0,0 +1,421 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventPropertyChangedTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventTest.cs new file mode 100644 index 0000000..e6dc981 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/ObserveEventTest.cs @@ -0,0 +1,421 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class ObserveEventTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On) + .ObserveSourceEvent("ValueChanged"); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text) + .ObserveSourceEvent("ValueChanged"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent("ValueChanged"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On) + .ObserveSourceEvent("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .ObserveSourceEvent("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .ObserveSourceEvent("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay) + .ObserveSourceEvent("ValueChanged") + .ObserveTargetEvent("ValueChanged"); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveSourceEvent("ValueChanged") + .ObserveTargetEvent("Changed"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent("ValueChanged"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay) + .ObserveSourceEvent("Changed") + .ObserveTargetEvent("ValueChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .ObserveSourceEvent("Changed") + .ObserveTargetEvent("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .ObserveSourceEvent("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay) + .ObserveTargetEvent("ValueChanged"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .ObserveTargetEvent("Changed"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/SetCommandTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/SetCommandTest.cs new file mode 100644 index 0000000..b27194b --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/SetCommandTest.cs @@ -0,0 +1,519 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class SetCommandTest + { + [Test] + public void SetCommand_OnBarButtonNoValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var control = new UIBarButtonItemEx(); + + control.SetCommand("Clicked", vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnBarButtonNoValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var control = new UIBarButtonItemEx(); + + control.SetCommand(vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnBarButtonWithBinding_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var control = new UIBarButtonItemEx(); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + control.SetCommand( + "Clicked", + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnBarButtonWithBindingNoEventName_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var control = new UIBarButtonItemEx(); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + control.SetCommand( + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnBarButtonWithSimpleValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var control = new UIBarButtonItemEx(); + + control.SetCommand( + "Clicked", + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnBarButtonWithSimpleValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var control = new UIBarButtonItemEx(); + + control.SetCommand( + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonNoValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var control = new UIButtonEx(); + + control.SetCommand("TouchUpInside", vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonNoValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + vmTarget.Configure(value); + + var control = new UIButtonEx(); + + control.SetCommand(vmTarget.SetPropertyWithoutValueCommand); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithBinding_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var control = new UIButtonEx(); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + control.SetCommand( + "TouchUpInside", + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithBindingNoEventName_ParameterShouldUpdate() + { + var value = DateTime.Now.Ticks.ToString(); + + var vmSource = new TestViewModel + { + Model = new TestModel + { + MyProperty = value + } + }; + + var vmTarget = new TestViewModel(); + + var control = new UIButtonEx(); + + var binding = new Binding( + vmSource, + () => vmSource.Model.MyProperty); + + control.SetCommand( + vmTarget.SetPropertyCommand, + binding); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + + value += "Test"; + vmSource.Model.MyProperty = value; + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithSimpleValue_NoError() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var control = new UIButtonEx(); + + control.SetCommand( + "TouchUpInside", + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_OnButtonWithSimpleValueNoEventName_ClickEventShouldBeUsed() + { + var value = DateTime.Now.Ticks.ToString(); + var vmTarget = new TestViewModel(); + + var control = new UIButtonEx(); + + control.SetCommand( + vmTarget.SetPropertyCommand, + value); + + Assert.IsNull(vmTarget.TargetProperty); + control.PerformEvent(); + Assert.AreEqual(value, vmTarget.TargetProperty); + } + + [Test] + public void SetCommand_WithICommandOnBarButtonNoValue_NoError() + { + var vmTarget = new TestViewModel(); + var control = new UIBarButtonItemEx(); + + control.SetCommand("Clicked", vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + control.PerformEvent(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + [Test] + public void SetCommand_WithICommandOnBarButtonNoValueNoEventName_ClickEventShouldBeUsed() + { + var vmTarget = new TestViewModel(); + var control = new UIBarButtonItemEx(); + + control.SetCommand(vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + control.PerformEvent(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + [Test] + public void SetCommand_WithICommandOnButtonNoValue_NoError() + { + var vmTarget = new TestViewModel(); + var control = new UIButtonEx(); + + control.SetCommand("TouchUpInside", vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + control.PerformEvent(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + [Test] + public void SetCommand_WithICommandOnButtonNoValueNoEventName_ClickEventShouldBeUsed() + { + var vmTarget = new TestViewModel(); + var control = new UIButtonEx(); + + control.SetCommand(vmTarget.TestCommandImpl); + + var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + Assert.IsNull(castedCommand.Parameter); + control.PerformEvent(); + Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + } + + // () => vmSource.Model.MyProperty); + // vmSource, + + // var binding = new Binding( + + // var checkBox = new CheckBox(Application.Context); + + // var vmTarget = new TestViewModel(); + // }; + // } + // MyProperty = value + // { + // Model = new TestModel + // { + + // var vmSource = new TestViewModel + // var value = DateTime.Now.Ticks.ToString(); + // { + // public void SetCommand_OnCheckBoxWithBinding_ParameterShouldUpdate() + + // [Test] + + // checkBox.SetCommand( + // "CheckedChange", + // vmTarget.SetPropertyCommand, + // binding); + + // Assert.IsNull(vmTarget.TargetProperty); + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + + // value += "Test"; + // vmSource.Model.MyProperty = value; + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + // } + + // [Test] + // public void SetCommand_OnCheckBoxWithBindingNoEventName_ParameterShouldUpdate() + // { + // var value = DateTime.Now.Ticks.ToString(); + + // var vmSource = new TestViewModel + // { + // Model = new TestModel + // { + // MyProperty = value + // } + // }; + + // var vmTarget = new TestViewModel(); + + // var checkBox = new CheckBox(Application.Context); + + // var binding = new Binding( + // vmSource, + // () => vmSource.Model.MyProperty); + + // checkBox.SetCommand( + // vmTarget.SetPropertyCommand, + // binding); + + // Assert.IsNull(vmTarget.TargetProperty); + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + + // value += "Test"; + // vmSource.Model.MyProperty = value; + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + // } + + // [Test] + // public void SetCommand_OnCheckBoxWithSimpleValue_NoError() + // { + // var value = DateTime.Now.Ticks.ToString(); + // var vmTarget = new TestViewModel(); + + // var checkBox = new CheckBox(Application.Context); + + // checkBox.SetCommand( + // "CheckedChange", + // vmTarget.SetPropertyCommand, + // value); + + // Assert.IsNull(vmTarget.TargetProperty); + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + // } + + // [Test] + // public void SetCommand_OnCheckBoxWithSimpleValueNoEventName_ClickEventShouldBeUsed() + // { + // var value = DateTime.Now.Ticks.ToString(); + // var vmTarget = new TestViewModel(); + + // var checkBox = new CheckBox(Application.Context); + + // checkBox.SetCommand( + // vmTarget.SetPropertyCommand, + // value); + + // Assert.IsNull(vmTarget.TargetProperty); + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + // } + + // [Test] + // public void SetCommand_OnCheckBoxNoValue_NoError() + // { + // var value = DateTime.Now.Ticks.ToString(); + // var vmTarget = new TestViewModel(); + // vmTarget.Configure(value); + + // var checkBox = new CheckBox(Application.Context); + + // checkBox.SetCommand("CheckedChange", vmTarget.SetPropertyWithoutValueCommand); + + // Assert.IsNull(vmTarget.TargetProperty); + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + // } + + // [Test] + // public void SetCommand_OnCheckBoxNoValueNoEventName_ClickEventShouldBeUsed() + // { + // var value = DateTime.Now.Ticks.ToString(); + // var vmTarget = new TestViewModel(); + // vmTarget.Configure(value); + + // var checkBox = new CheckBox(Application.Context); + + // checkBox.SetCommand(vmTarget.SetPropertyWithoutValueCommand); + + // Assert.IsNull(vmTarget.TargetProperty); + // checkBox.PerformClick(); + // Assert.AreEqual(value, vmTarget.TargetProperty); + // } + + // [Test] + // public void SetCommand_WithICommandOnCheckBoxNoValue_NoError() + // { + // var vmTarget = new TestViewModel(); + // var checkBox = new CheckBox(Application.Context); + + // checkBox.SetCommand("CheckedChange", vmTarget.TestCommandImpl); + + // var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + // Assert.IsNull(castedCommand.Parameter); + // checkBox.PerformClick(); + // Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + // } + + // [Test] + // public void SetCommand_WithICommandOnCheckBoxNoValueNoEventName_ClickEventShouldBeUsed() + // { + // var vmTarget = new TestViewModel(); + // var checkBox = new CheckBox(Application.Context); + + // checkBox.SetCommand(vmTarget.TestCommandImpl); + + // var castedCommand = (CommandImpl)vmTarget.TestCommandImpl; + + // Assert.IsNull(castedCommand.Parameter); + // checkBox.PerformClick(); + // Assert.AreEqual(TestViewModel.ValueForCommand, castedCommand.Parameter); + // } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerImplicitTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerImplicitTest.cs new file mode 100644 index 0000000..efc35f3 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerImplicitTest.cs @@ -0,0 +1,403 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerImplicitTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerNoArgumentTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerNoArgumentTest.cs new file mode 100644 index 0000000..6abeb2c --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerNoArgumentTest.cs @@ -0,0 +1,421 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerNoArgumentTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On) + .UpdateSourceTrigger(); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text) + .UpdateSourceTrigger(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .UpdateTargetTrigger(); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .UpdateTargetTrigger(); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .UpdateTargetTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger() + .UpdateTargetTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay) + .UpdateTargetTrigger(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateTargetTrigger(); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerPropertyChangedTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerPropertyChangedTest.cs new file mode 100644 index 0000000..70f24d8 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerPropertyChangedTest.cs @@ -0,0 +1,421 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerPropertyChangedTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateTargetTrigger(UpdateTriggerMode.PropertyChanged); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerTest.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerTest.cs new file mode 100644 index 0000000..d237eda --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Binding/UpdateTriggerTest.cs @@ -0,0 +1,421 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using GalaSoft.MvvmLight.Helpers; +using GalaSoft.MvvmLight.Test.Controls; +using GalaSoft.MvvmLight.Test.ViewModel; +using NUnit.Framework; + +namespace GalaSoft.MvvmLight.Test.Binding +{ + [TestFixture] + [SuppressMessage("ReSharper", "InconsistentNaming")] + public class UpdateTriggerTest + { + [Test] + public void Binding_OneWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On) + .UpdateSourceTrigger("ValueChanged"); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text) + .UpdateSourceTrigger("ValueChanged"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger("ValueChanged"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On) + .UpdateSourceTrigger("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + } + + [Test] + public void Binding_OneWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text) + .UpdateSourceTrigger("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + } + + [Test] + public void Binding_OneWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty) + .UpdateSourceTrigger("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + + [Test] + public void Binding_OneWayFromViewModelToCheckBox_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + } + + [Test] + public void Binding_OneWayFromViewModelToEditText_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UISwitchEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + control2, + () => control2.On, + BindingMode.TwoWay) + .UpdateSourceTrigger("ValueChanged") + .UpdateTargetTrigger("ValueChanged"); + + Assert.IsFalse(control1.On); + Assert.IsFalse(control2.On); + control1.On = true; + Assert.IsTrue(control1.On); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control2, + () => control2.On, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger("ValueChanged") + .UpdateTargetTrigger("Changed"); + + Assert.AreEqual("False", control1.Text); + Assert.IsFalse(control2.On); + control2.On = true; + Assert.AreEqual("True", control1.Text); + Assert.IsTrue(control2.On); + + var value = "False"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsFalse(control2.On); + } + + [Test] + public void Binding_TwoWayFromCheckBoxToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.On, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger("ValueChanged"); + + Assert.AreEqual("False", vm.Model.MyProperty); + Assert.IsFalse(control1.On); + control1.On = true; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + var value = "False"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + } + + [Test] + public void Binding_TwoWayFromEditTextToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UISwitchEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.On, + BindingMode.TwoWay) + .UpdateSourceTrigger("Changed") + .UpdateTargetTrigger("ValueChanged"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.IsFalse(control2.On); + var value = "True"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.IsTrue(control2.On); + + control2.On = false; + Assert.IsFalse(control2.On); + Assert.AreEqual("False", control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var control1 = new UITextViewEx(); + var control2 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + control2, + () => control2.Text, + BindingMode.TwoWay) + .UpdateSourceTrigger("Changed") + .UpdateTargetTrigger("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, control2.Text); + + value += "Suffix"; + control2.Text = value; + Assert.AreEqual(value, control2.Text); + Assert.AreEqual(control2.Text, control1.Text); + } + + [Test] + public void Binding_TwoWayFromEditTextToViewModelWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + control1, + () => control1.Text, + vm, + () => vm.Model.MyProperty, + BindingMode.TwoWay) + .UpdateSourceTrigger("Changed"); + + Assert.AreEqual(string.Empty, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + var value = DateTime.Now.Ticks.ToString(); + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + + value += "Suffix"; + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + } + + [Test] + public void Binding_TwoWayFromViewModelToCheckBoxWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UISwitchEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.On, + BindingMode.TwoWay) + .UpdateTargetTrigger("ValueChanged"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.IsFalse(control1.On); + vm.Model.MyProperty = "True"; + Assert.AreEqual("True", vm.Model.MyProperty); + Assert.IsTrue(control1.On); + + control1.On = false; + Assert.IsFalse(control1.On); + Assert.AreEqual("False", vm.Model.MyProperty); + } + + [Test] + public void Binding_TwoWayFromViewModelToEditTextWithUpdateTrigger_BindingGetsUpdated() + { + var vm = new TestViewModel + { + Model = new TestModel() + }; + + var control1 = new UITextViewEx(); + + var binding = new Binding( + vm, + () => vm.Model.MyProperty, + control1, + () => control1.Text, + BindingMode.TwoWay) + .UpdateTargetTrigger("Changed"); + + Assert.AreEqual(null, vm.Model.MyProperty); + Assert.AreEqual(string.Empty, control1.Text); + var value = DateTime.Now.Ticks.ToString(); + vm.Model.MyProperty = value; + Assert.AreEqual(value, vm.Model.MyProperty); + Assert.AreEqual(vm.Model.MyProperty, control1.Text); + + value += "Suffix"; + control1.Text = value; + Assert.AreEqual(value, control1.Text); + Assert.AreEqual(control1.Text, vm.Model.MyProperty); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIBarButtonItemEx.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIBarButtonItemEx.cs new file mode 100644 index 0000000..955fd33 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIBarButtonItemEx.cs @@ -0,0 +1,31 @@ +using System; +using UIKit; + +namespace GalaSoft.MvvmLight.Test.Controls +{ + // ReSharper disable once InconsistentNaming + public class UIBarButtonItemEx : UIBarButtonItem + { + public UIBarButtonItemEx() + { + base.Clicked += BaseClicked; + } + + public void PerformEvent() + { + var handler = Clicked; + + if (handler != null) + { + handler(this, EventArgs.Empty); + } + } + + private void BaseClicked(object sender, EventArgs e) + { + PerformEvent(); + } + + public new event EventHandler Clicked; + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIButtonEx.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIButtonEx.cs new file mode 100644 index 0000000..398c421 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UIButtonEx.cs @@ -0,0 +1,31 @@ +using System; +using UIKit; + +namespace GalaSoft.MvvmLight.Test.Controls +{ + // ReSharper disable once InconsistentNaming + public class UIButtonEx : UIButton + { + public UIButtonEx() + { + base.TouchUpInside += BaseTouchUpInside; + } + + public void PerformEvent() + { + var handler = TouchUpInside; + + if (handler != null) + { + handler(this, EventArgs.Empty); + } + } + + private void BaseTouchUpInside(object sender, EventArgs e) + { + PerformEvent(); + } + + public new event EventHandler TouchUpInside; + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UISwitchEx.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UISwitchEx.cs new file mode 100644 index 0000000..9ed3487 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UISwitchEx.cs @@ -0,0 +1,48 @@ +using System; +using UIKit; + +namespace GalaSoft.MvvmLight.Test.Controls +{ + // ReSharper disable once InconsistentNaming + public class UISwitchEx : UISwitch + { + public new bool On + { + get + { + return base.On; + } + + set + { + if (base.On != value) + { + base.On = value; + PerformEvent(); + } + } + } + + public UISwitchEx() + { + base.ValueChanged += BaseValueChanged; + } + + public void PerformEvent() + { + var handler = ValueChanged; + + if (handler != null) + { + handler(this, EventArgs.Empty); + } + } + + private void BaseValueChanged(object sender, EventArgs e) + { + PerformEvent(); + } + + public new event EventHandler ValueChanged; + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UITextViewEx.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UITextViewEx.cs new file mode 100644 index 0000000..0f019dd --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Controls/UITextViewEx.cs @@ -0,0 +1,48 @@ +using System; +using UIKit; + +namespace GalaSoft.MvvmLight.Test.Controls +{ + // ReSharper disable once InconsistentNaming + public class UITextViewEx : UITextView + { + public new string Text + { + get + { + return base.Text; + } + + set + { + if (base.Text != value) + { + base.Text = value; + PerformEvent(); + } + } + } + + public UITextViewEx() + { + base.Changed += BaseChanged; + } + + public void PerformEvent() + { + var handler = Changed; + + if (handler != null) + { + handler(this, EventArgs.Empty); + } + } + + private void BaseChanged(object sender, EventArgs e) + { + PerformEvent(); + } + + public new event EventHandler Changed; + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Entitlements.plist b/GalaSoft.MvvmLight/Tests/AppleTestApp/Entitlements.plist new file mode 100644 index 0000000..13b1642 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Entitlements.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/GalaSoft.MvvmLight.Test (iOS).csproj b/GalaSoft.MvvmLight/Tests/AppleTestApp/GalaSoft.MvvmLight.Test (iOS).csproj new file mode 100644 index 0000000..f407bb6 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/GalaSoft.MvvmLight.Test (iOS).csproj @@ -0,0 +1,176 @@ + + + + Debug + iPhoneSimulator + {D688119A-4FA8-4764-BE47-90724571B80C} + {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + GalaSoft.MvvmLight.Test + Resources + AppleTestApp + + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG + prompt + 4 + false + i386 + None + true + + + none + true + bin\iPhoneSimulator\Release + prompt + 4 + None + i386 + false + + + true + full + false + bin\iPhone\Debug + DEBUG + prompt + 4 + false + ARMv7, ARM64 + Entitlements.plist + iPhone Developer + true + + + none + true + bin\iPhone\Release + prompt + 4 + Entitlements.plist + ARMv7, ARM64 + false + iPhone Developer + + + none + True + bin\iPhone\Ad-Hoc + prompt + 4 + False + ARMv7, ARM64 + Entitlements.plist + True + Automatic:AdHoc + iPhone Distribution + + + none + True + bin\iPhone\AppStore + prompt + 4 + False + ARMv7, ARM64 + Entitlements.plist + Automatic:AppStore + iPhone Distribution + + + + Helpers\Binding.cs + + + Helpers\BindingGeneric.cs + + + Helpers\BindingGenericObsolete.cs + + + Helpers\BindingMode.cs + + + Helpers\Extensions.cs + + + Helpers\IWeakEventListener.cs + + + Helpers\PropertyChangedEventManager.cs + + + Helpers\UpdateSourceTriggerMode.cs + + + Helpers\BindingGenericApple.cs + + + Helpers\BindingGenericObsoleteApple.cs + + + Helpers\ExtensionsApple.cs + + + Helpers\ObservableTableViewController.cs + + + Binding\BindingTest.cs + + + ViewModel\CommandImpl.cs + + + ViewModel\TestModel.cs + + + ViewModel\TestViewModel.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {6a912701-3ba1-4975-adbf-160caf66b640} + GalaSoft.MvvmLight %28PCL%29 + + + {39c71a69-4ace-4b45-9a2c-c274fada78ef} + GalaSoft.MvvmLight.Extras %28PCL%29 + + + + \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/GettingStarted.Xamarin b/GalaSoft.MvvmLight/Tests/AppleTestApp/GettingStarted.Xamarin new file mode 100644 index 0000000..ccfcf94 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/GettingStarted.Xamarin @@ -0,0 +1,4 @@ + + GS\iOS\CS\iOSApp\GettingStarted.html + false + \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Info.plist b/GalaSoft.MvvmLight/Tests/AppleTestApp/Info.plist new file mode 100644 index 0000000..6161792 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDisplayName + AppleTestApp + CFBundleIdentifier + com.companyname.AppleTestApp + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + MinimumOSVersion + 8.3 + UIDeviceFamily + + 1 + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + + diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Main.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Main.cs new file mode 100644 index 0000000..7837a56 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Main.cs @@ -0,0 +1,15 @@ +using UIKit; + +namespace GalaSoft.MvvmLight.Test +{ + public class Application + { + // This is the main entry point of the application. + private static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, "AppDelegate"); + } + } +} \ No newline at end of file diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Properties/AssemblyInfo.cs b/GalaSoft.MvvmLight/Tests/AppleTestApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2d37f08 --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AppleTestApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AppleTestApp")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d688119a-4fa8-4764-be47-90724571b80c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GalaSoft.MvvmLight/Tests/AppleTestApp/Resources/LaunchScreen.xib b/GalaSoft.MvvmLight/Tests/AppleTestApp/Resources/LaunchScreen.xib new file mode 100644 index 0000000..8f7997f --- /dev/null +++ b/GalaSoft.MvvmLight/Tests/AppleTestApp/Resources/LaunchScreen.xib @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +