El comando de enlace de botón en AppBar no funciona

¿Por qué el comando en el siguiente ejemplo no se ejecuta?

Tengo una página con nombre con una barra de aplicaciones y un botón en ella:

   

El comando “OkCommand” se define en el código subyacente de esta manera (utilizando MVVM light framework):

 public RelayCommand OkCommand { get { return m_OkCommand ?? (m_OkCommand = new RelayCommand( async () => { await new MessageDialog("OkCommand").ShowAsync(); })); } } 

No hay errores de vinculación ni otras sugerencias en la ventana de resultados que me den una idea de por qué esto no funciona. (Aparte: si el botón se coloca fuera de la barra de aplicaciones, todo funciona bien)

¿Alguien tiene una idea de lo que está mal aquí?

No debe haber ninguna razón para que el enlace de comando no funcione para un botón en la AppBar de AppBar si funciona para un botón en otra parte de la página.

Sospecho que el problema está relacionado con cómo se establece DataContext . Debe tenerlo configurado a nivel de página en lugar de más bajo en el árbol de control. Todos los demás botones están dentro del control de contenido superior de la página, mientras que la AppBar está fuera de ella, lo que hace que el enlace no funcione si DataContext se establece en el control de contenido superior o más abajo.

Puedes probarlo con el siguiente ejemplo de trabajo:

MainPage.xaml :

             

ViewModel.cs :

 public class ViewModel { private RelayCommand _okCommand; public RelayCommand OkCommand { get { return _okCommand ?? (_okCommand = new RelayCommand( async _ => { await new MessageDialog("OkCommand").ShowAsync(); })); } } } 

MainPage.xaml.cs :

 public sealed partial class MainPage : LayoutAwarePage { public MainPage() { this.InitializeComponent(); DataContext = new ViewModel(); } } 

Sé que esta pregunta es para Windows RT / 8, sin embargo, encontré este mismo problema con Universal Apps (UWP) y encontré la solución utilizando el nuevo {x: Bind}. Tenga en cuenta que, de forma predeterminada, x: Bind se asignará a OneTime en lugar de {Binding} donde estaba OneWay.

Encontré este patrón mientras miraba uno de los videos de MSDN para Windows 10 Developer en el nuevo enlace XAML.

Modificar YourPage.cs

 public sealed partial class YourPage : Page { public ViewModels.YourPageViewModel ViewModel { get; set; } public YourPage() { this.InitializeComponent(); if (DesignMode.DesignModeEnabled) return; this.DataContextChanged += (s, e) => { ViewModel = DataContext as ViewModels.YourPageViewModel; }; } } 

Modificar YourPageViewModel.cs

 public class YourPageViewModel : ViewModelBase { private ICommand newFunctionCommand; public ICommand NewFunctionCommand { get { return newFunctionCommand; } } public YourPageViewModel() { if (DesignMode.DesignModeEnabled) return; if (newFunctionCommand == null) newFunctionCommand = new ICommand(new Action(NewFunction)); } protected void NewFunction() { } } 

Modificar YourPage.xaml