豆瓣电台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是不合适的。
摘自 菜鸟耕地