wpf如何把click TextChanged MouseLive等路由事件轉換為command
我們在進行wpf程式設計的時候為了更好的執行M V V M的程式設計模式。通常要把路由事件轉換為command
但是通常情況下大多數wpf控制元件只有一個command屬性用於繫結viewmodel中的命令
如button的click mouseenter mouseleave等路由事件怎麼轉化為command以呼叫viewmodel中的命令呢
通過下面的方法可以輕鬆的實現
1、首先要在專案裡引入兩個程式集
Microsoft.Practices.Prism.dll
System.Windows.Interactivity.dll
第一個程式集網上可以下到
第二個程式集通常裝完vs後自帶blend版本,那麼該程式集就在這個blend版本下面
具體位置:C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries\System.Windows.Interactivity.dll
2、xaml程式碼段的編寫
首先要在xaml頭部引入相應的名稱空間
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
比如現在又這樣一個需求要在gridcontrol loaded完後執行某個命令(viewmode裡)
按照通常的路由事件的思路直接在.cs後臺檔案中寫。但是為了更好的遵循mvvm的實現原則。我們使用另一種方法
<dxg:GridControl x:name="testGC">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding ElementName=testGC}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</dxg:GridControl>
紅色部分是關鍵程式碼在呼叫命令的時候還可以傳入引數
3、viewmodel中的被呼叫的命令形式(viewmodel.cs)
private ICommand loadedCommand;
public ICommand LoadedCommand
{
get { return loadedCommand; }
}
定義一個命令屬性已把後臺命令暴露給前端xaml。
下面我們定義一個命令要執行的方法
private void GridcontrolLoaded(GridControl gc)
{
//todo
}
最後在類建構函式中 把命令和方法關聯起來
loadedCommand= new DelegateCommand<GridControl>(GridcontrolLoaded);
注意DelegateCommand要引入Microsoft.Practices.Prism.Commands名稱空間
至此整個過程已經完成、若有疑問或建議歡迎提問探討。