当前位置:编程学习 > wap >>

豆瓣电台WP7客户端 MVVM重构记录之使用MVVM Light实现Event绑定

这次实现了MVVM Light事件的绑定。MVVM Light为事件绑定提供了很好的支持,它有很多种方式可以实现。对于支持Command的事件比如Button的Click事件那么最简单可以直接绑定Command。对于不支持Command的事件比如TextChanged可以使用InvokeCommandAction或者EventToCommand来绑定。这里我就不展开了,因为自己也是一知半解,以免误导看客。这次我演示使用EventToCommand来绑定HubTile的Tap事件。
在ViewModel里定义一个RelayCommand:

namespaceDBFM7.ViewModel
{
    public classChannelTileViewModel: ViewModelBase
   {
        /// <summary>
        ///Initializes a new instance of the ChannelTileViewModel class.
       /// </summary>
       publicChannelTileViewModel()
        {
            TouchPanel.EnabledGestures = GestureType.Tap | GestureType.HorizontalDrag;

            this._TapCommand = newRelayCommand<string>(this.HubTile_Tap);
        }


        privateRelayCommand<string> _TapCommand;

        publicRelayCommand<string> TapCommand
        {
            get{ return_TapCommand; }
            set
           {
                _TapCommand = value;
                this.RaisePropertyChanged("TapCommand");
            }
        }

       private voidHubTile_Tap(string hubTile)
        {
         MessageBox.Show(hubTile);

        }


    }
}
 
在View添加xmlns:
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP71"
绑定tap:
     <toolkit:HubTile Grid.Row="0" Grid.Column="1"
                              Margin="12,12,0,0"
                             x:Name="OM" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Tap">
                        <cmd:EventToCommand Command="{Binding TapCommand}"
                                            CommandParameter="{ Binding Title, ElementName=OM }" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </toolkit:HubTile>
EventToCommand 的 Command绑定命令,CommandParameter绑定的是传递的参数。其中PassEventArgsToCommand可以传递事件的args。
我本来是要想传递事件的sender过去的,虽然可以实现,不过过于繁琐,且在国外论坛看到这样传递不符合MVVM的思想。
My stance on MVVM is:
View : knows about ViewModel
ViewModel : knows about Model (has NO knowledge of View)
Model : holds data. (has NO knowledge of ViewModel, View)
所以传递sender到VM是不合适的。

 

摘自 菜鸟耕地
补充:移动开发 , Windows Phone ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,