542179528 发表于 2015-5-13 10:47:56

Using commands with ApplicationBarMenuItem and ApplicationBarButton in Windows P

  Unfortunately, in the current version of the Windows Phone 7 Silverlight framework, it is not possible to attach any command on the ApplicationBarMenuItem and ApplicationBarButton controls. These two controls appear in the Application Bar, for example with the following markup:



view source
http://www.galasoft.ch/script/clipboard.swfprint?

01.
02.   
03.      
04.            
06.            
08.      
09.      
10.            
12.            
14.            
16.      
17.   
18.  This code will create the following UI:
http://farm5.static.flickr.com/4054/4505875943_63225ac53f.jpg
Application bar, collapsed
  
http://farm5.static.flickr.com/4055/4506512944_5dcc2f5638.jpg
Application bar, expanded
  ApplicationBarItems are not, however, controls. A quick look in MSDN shows the following hierarchy for ApplicationBarMenuItem, for example:
http://farm5.static.flickr.com/4031/4505879571_aff9307c12.jpg
  Unfortunately, this prevents all the mechanisms that are normally used to attach a Command (for example a RelayCommand) to a control. For example, the attached behavior present in the class ButtonBaseExtension (from the Silverlight 3 version of the MVVM Light toolkit) can only be attached to a DependencyObject. Similarly, Blend behaviors (such as EventToCommand from the toolkit’s Extras library) needs a FrameworkElement to work.
Using code behind
  The alternative is to use code behind. As I said in my MIX10 talk, the MVVM police will not take your family away if you use code behind (this quote was actually suggested to me by Glenn Block); the code behind is there for a reason. In our case, invoking a command in the ViewModel requires the following code:
  In MainPage.xaml:



view source
http://www.galasoft.ch/script/clipboard.swfprint?

1.  In MainPage.xaml.cs



view source
http://www.galasoft.ch/script/clipboard.swfprint?

01.private void ApplicationBarMenuItemClick(
02.    object sender,
03.    System.EventArgs e)
04.{
05.    var vm = DataContext as MainViewModel;
06.    if (vm != null)
07.    {
08.      vm.MyCommand.Execute(null);
09.    }
10.}Conclusion
  Resorting to code behind to bridge the gap between the View and the ViewModel is less elegant than using attached behaviors, either through an attached property or through a Blend behavior. It does, however, work fine. I don’t have any information if future changes in the Windows Phone 7 Application Bar API will make this easier. In the mean time, I would recommend using code behind instead.
页: [1]
查看完整版本: Using commands with ApplicationBarMenuItem and ApplicationBarButton in Windows P