欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-05-04 10:16:11
这次实现了mvvm light事件的绑定。mvvm light为事件绑定提供了很好的支持,它有很多种方式可以实现。对于支持command的事件比如button的click事件那么最简单可以直接绑定c...

这次实现了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是不合适的。

 

摘自 菜鸟耕地