Note that there are some explanatory texts on larger screens.

plurals
  1. POViewModel is Null on Page
    primarykey
    data
    text
    <p>I am attempting to access a property in a view model I created called <code>TrialViewModel</code> which is to help me in my trial application implementation. The <code>TrialViewModel</code> links to a class named <code>TrialExperienceHelper.cs</code> with methods to purchase the application, get the trial license mode, etc. When I try to access the <code>TrialViewModel</code> from my view, I am getting a NullReferenceException but I am not sure why?</p> <p>TrialViewModel</p> <pre><code>public class TrialViewModel : PropertyChangedNotifier { #region fields private RelayCommand buyCommand; #endregion fields #region constructors public TrialViewModel() { // Subscribe to the helper class's static LicenseChanged event so that we can re-query its LicenseMode property when it changes. TrialExperienceHelper.LicenseChanged += TrialExperienceHelper_LicenseChanged; } #endregion constructors #region properties public RelayCommand BuyCommand { get { if (this.buyCommand == null) { // The RelayCommand is constructed with two parameters - the action to perform on invocation, // and the condition under which the command can execute. It's important to call RaiseCanExecuteChanged // on a command whenever its can-execute condition might have changed. Here, we do that in the TrialExperienceHelper_LicenseChanged // event handler. this.buyCommand = new RelayCommand( param =&gt; TrialExperienceHelper.Buy(), param =&gt; TrialExperienceHelper.LicenseMode == TrialExperienceHelper.LicenseModes.Trial); } return this.buyCommand; } } public string LicenseModeString { get { return TrialExperienceHelper.LicenseMode.ToString()/* + ' ' + AppResources.ModeString*/; } } #endregion properties #region event handlers // Handle TrialExperienceHelper's LicenseChanged event by raising property changed notifications on the // properties and commands that internal void TrialExperienceHelper_LicenseChanged() { this.RaisePropertyChanged("LicenseModeString"); this.BuyCommand.RaiseCanExecuteChanged(); } #endregion event handlers } </code></pre> <p>TrialExperienceHelper.cs</p> <pre><code>public static class TrialExperienceHelper { #region enums /// &lt;summary&gt; /// The LicenseModes enumeration describes the mode of a license. /// &lt;/summary&gt; public enum LicenseModes { Full, MissingOrRevoked, Trial } #endregion enums #region fields #if DEBUG // Determines how a debug build behaves on launch. This field is set to LicenseModes.Full after simulating a purchase. // Calling the Buy method (or navigating away from the app and back) will simulate a purchase. internal static LicenseModes simulatedLicMode = LicenseModes.Trial; #endif // DEBUG private static bool isActiveCache; private static bool isTrialCache; #endregion fields #region constructors // The static constructor effectively initializes the cache of the state of the license when the app is launched. It also attaches // a handler so that we can refresh the cache whenever the license has (potentially) changed. static TrialExperienceHelper() { TrialExperienceHelper.RefreshCache(); PhoneApplicationService.Current.Activated += (object sender, ActivatedEventArgs e) =&gt; TrialExperienceHelper. #if DEBUG // In debug configuration, when the user returns to the application we will simulate a purchase. OnSimulatedPurchase(); #else // DEBUG // In release configuration, when the user returns to the application we will refresh the cache. RefreshCache(); #endif // DEBUG } #endregion constructors #region properties /// &lt;summary&gt; /// The LicenseMode property combines the active and trial states of the license into a single /// enumerated value. In debug configuration, the simulated value is returned. In release configuration, /// if the license is active then it is either trial or full. If the license is not active then /// it is either missing or revoked. /// &lt;/summary&gt; public static LicenseModes LicenseMode { get { #if DEBUG return simulatedLicMode; #else // DEBUG if (TrialExperienceHelper.isActiveCache) { return TrialExperienceHelper.isTrialCache ? LicenseModes.Trial : LicenseModes.Full; } else // License is inactive. { return LicenseModes.MissingOrRevoked; } #endif // DEBUG } } /// &lt;summary&gt; /// The IsFull property provides a convenient way of checking whether the license is full or not. /// &lt;/summary&gt; public static bool IsFull { get { return (TrialExperienceHelper.LicenseMode == LicenseModes.Full); } } #endregion properties #region methods /// &lt;summary&gt; /// The Buy method can be called when the license state is trial. the user is given the opportunity /// to buy the app after which, in all configurations, the Activated event is raised, which we handle. /// &lt;/summary&gt; public static void Buy() { MarketplaceDetailTask marketplaceDetailTask = new MarketplaceDetailTask(); marketplaceDetailTask.ContentType = MarketplaceContentType.Applications; marketplaceDetailTask.Show(); } /// &lt;summary&gt; /// This method can be called at any time to refresh the values stored in the cache. We re-query the application object /// for the current state of the license and cache the fresh values. We also raise the LicenseChanged event. /// &lt;/summary&gt; public static void RefreshCache() { TrialExperienceHelper.isActiveCache = CurrentApp.LicenseInformation.IsActive; TrialExperienceHelper.isTrialCache = CurrentApp.LicenseInformation.IsTrial; TrialExperienceHelper.RaiseLicenseChanged(); } private static void RaiseLicenseChanged() { if (TrialExperienceHelper.LicenseChanged != null) { TrialExperienceHelper.LicenseChanged(); } } #if DEBUG private static void OnSimulatedPurchase() { TrialExperienceHelper.simulatedLicMode = LicenseModes.Full; TrialExperienceHelper.RaiseLicenseChanged(); } #endif // DEBUG #endregion methods #region events /// &lt;summary&gt; /// The static LicenseChanged event is raised whenever the value of the LicenseMode property has (potentially) changed. /// &lt;/summary&gt; public static event LicenseChangedEventHandler LicenseChanged; #endregion events } </code></pre> <p>View</p> <pre><code>protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); modeTextBlock.Text = TrialViewModel.LicenseModeString; //NullReferenceException } private void popupButton_Click(object sender, RoutedEventArgs e) { var button = sender as Button; string option = button.Name; switch (option) { case "purchaseButton": // A command takes a parameter and in this case we can pass null. TrialViewModel.BuyCommand.Execute(null); //NullReferenceException break; case "cancelButton": if (editPagePivotControl != null &amp;&amp; editPagePivotControl.SelectedIndex != 0) { editPagePivotControl.SelectedIndex = 0; } break; } } private TrialViewModel TrialViewModel { get { return this.DataContext as TrialViewModel; } } </code></pre> <p>Any ideas? I really need to be able to access the <code>Buy</code> Command to send a user to the Marketplace purchase page, as well as get the current license mode.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload