1. 程式人生 > >wpf如何把click TextChanged MouseLive等路由事件轉換為command

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名稱空間

至此整個過程已經完成、若有疑問或建議歡迎提問探討。