The problem of the Windows Phone 7 ApplicationBar and not (yet) updated Bindings

As a MVVM enthusiast I’m trying to use MVVM as much as possible, but not for things that are almost impossible to do with MVVM. But simple things, like a TextBox Text property is always bound to a ViewModel’s property. That’s something that works very well…until you start having ApplicationBar buttons and menu items.

A lot of people already know that the ApplicationBar is something special, it’s not just a control like other stuff in your application. When clicking a button on the ApplicationBar the Binding is not yet updated. This is basically because the focus which is on the TextBox for example won’t be changed when clicking ApplicationBar buttons. This is different compared to normal buttons that you put somewhere on your page.

The Solution?

I’ve read different solutions on the web. For example, force focus on a different control by calling the Focus method on a Control. While this is working, I found a technically nicer solution. By getting the Binding of the current focused control and updating that binding.

I wrote a small helper class that implements this Binding updating.

public static class ApplicationBarHelper
{
    public static void UpdateBindingOnFocussedControl()
    {
        object focusedElement = FocusManager.GetFocusedElement();
        if (focusedElement != null && focusedElement is TextBox)
        {
            var binding = (focusedElement as TextBox).GetBindingExpression(TextBox.TextProperty);
            if (binding != null)
                binding.UpdateSource();
        }
    } 
}

The first thing you do in the Event handlers for the ApplicationBar Click events is call.

ApplicationBarHelper.UpdateBindingOnFocussedControl();

What about the BindableApplicationBar?

A lot of use MVVM enthusiasts are using the BindableApplicationBar that’s part of the Phone7.Fx library. Can we use this in combination with the BindableApplicationBar? Yes we can, actually the best way would be to have this integrated with the BindableApplicationBar itself. I have just downloaded the source and manipulated two methods in two classes.

public class BindableApplicationBarIconButton : FrameworkElement, IApplicationBarIconButton
{
    // Other code that hasn't been changed in this class.

    void ApplicationBarIconButtonClick(object sender, EventArgs e)
    {
        ApplicationBarHelper.UpdateBindingOnFocussedControl();
        if (Command != null && CommandParameter != null)
            Command.Execute(CommandParameter);
        else if (Command != null)
            Command.Execute(CommandParameterValue);
        if (Click != null)
            Click(this, e);
    }
}

public class BindableApplicationBarMenuItem : FrameworkElement, IApplicationBarMenuItem
{
    // Other code that hasn't been changed in this class.

    private void ApplicationBarMenuItemClick(object sender, EventArgs e)
    {
        ApplicationBarHelper.UpdateBindingOnFocussedControl();
        if (Command != null && CommandParameter != null)
            Command.Execute(CommandParameter);
        else if (Command != null)
            Command.Execute(CommandParameterValue);
        if (Click != null)
            Click(this, e);
    }
}
  • Gravatar vetement abercrombie pas cher April 14th, 2014 at 04:06
    J'ai arrêté de manger après le dîner.
  • Gravatar sac hollister homme April 14th, 2014 at 04:06
    Vous pourriez aussi le désir de choisir une compagnie de transport pas cher qui porte l'assurance. Choisir une société avec une très bonne couverture d'assurance pourrait s'avérer extrêmement critique si quelque chose se produit à votre cargaison. Si vous confiez une organisation avec vos biens, en particulier si les marchandises sont utiles, vous devriez désirez pour assurer que l'entreprise choisie va prendre soin de votre cargaison. Ne pas oublier que les entreprises de logistique de fret ainsi que leurs normes devraient varier pour les expéditeurs nationaux, par opposition à une grande entreprise de transporter une énorme quantité de la cargaison. Ainsi, lorsque vous êtes prêt à décider de la faible organisation du fret coût de votre agréable, essayez de découvrir une qui a une histoire à long terme de fiabilité. Aussi les beaucoup plus de contacts de l'entreprise a, le plus lisse le mode de livraison aller, ainsi que la moins compliquée de la route est à la destination finale, le revenu beaucoup moins vous pouvez probablement besoin de payer. Hollister possède une passion pour l'intérêt du développement des affaires dans la plupart des technologies récentes. (Brad Hollister). L'article est strictement à titre indicatif et ne doivent pas être utilisés en aucune façon, mis en œuvre ou appliquées sans consultation d'un professionnel des fins éducatives ou de divertissement. S'il vous plaît lire nos Conditions d'utilisation pour plus d'informations.
  • Gravatar discount toms outlet April 17th, 2014 at 09:30
    Love the thoughts although can we say definitively, even with hindsight, that we are better off for Lincoln's choices than we would be without them? Slavery was already on the way out prior to the Civil War because it was economically unfeasible to continue until the cotton gin was invented and made slavery profitable for a while longer. But the industrial revolution would have ended it just as it did for Brazil. Yes, it might have taken a few years longer than the Civil War, but was it worth killing upwards of a million people? And were Lincoln's violations of the US Constitution and the precedent those actions set worth it?
Gravatar