zoukankan      html  css  js  c++  java
  • 豆瓣电台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是不合适的。

    更多的关于事件绑定请参考:http://geekswithblogs.net/lbugnion/archive/2009/11/05/mvvm-light-toolkit-v3-alpha-2-eventtocommand-behavior.aspx


    下节我将在WP7中使用MVVM Light的Message机制实现页面导航。

    QQ群:1022985150 VX:kklldog 一起探讨学习.NET技术
    作者:Agile.Zhou(kklldog)
    出处:http://www.cnblogs.com/kklldog/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    扩展GridView控件增加选择列
    Flash图片轮换/切换左右推拉效果
    Flash图片轮换/切换普通效果1
    WebForm_PostBackOptions未定义 解决方法
    SQL Server 2008无法还原日志备份或差异备份的问题解决(转)
    一个简单的C#多线程间同步的例子.[转]
    SQL2008报错:无法还原日志备份或差异备份,因为没有文件可用于前滚(转)
    C# 字符、字符串过滤,只能输入数字、中文、英文、大写、小写(转)
    C# Monitor类锁定对象
    使用SqlServer中的float类型时发现的问题(转)
  • 原文地址:https://www.cnblogs.com/kklldog/p/2373503.html
Copyright © 2011-2022 走看看