上一篇已經簡單說了一下引導類和簡單的控件綁定
我的上一個例子里的button自動匹配到ViewModel事件你一定感覺很好玩吧
今天說一下它的Actions,看一下Caliburn.Micro給我們提供了多強大的支持
我們還是從做例子開始
demo的源碼下載在文章的最后
例子1.無參數方法調用
點擊button把textBox輸入的文本彈出來
如果textbox里沒有文本button不可點,看一下效果圖
看一下前台代碼
<StackPanel> <TextBox x:Name="Mytxt" /> <Button Height="30" Margin="0,3" Content="Click Me"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <cal:ActionMessage MethodName="MyClick"> </cal:ActionMessage> </i:EventTrigger> </i:Interaction.Triggers> </Button> </StackPanel>
是通過行為把click事件傳遞給Myclick方法
也可以這么寫
<Button Height="30" Margin="0,3" Content="Click Me2" cal:Message.Attach="[Event Click]=[Action MyClick()]"/>
因為沒有參數Action MyClick() 的括號可以不用寫直接寫成Action MyClick也可以
如果你用其它的控件想把事件和viewmodel里的方法關聯起來這個是一樣的把Click換成其它的事件就ok
viewModel的代碼
[Export(typeof(IShell))] class AppViewModel: PropertyChangedBase,IShell { private string _Mytxt; public string Mytxt { get { return _Mytxt; } set { _Mytxt = value; NotifyOfPropertyChange(() => Mytxt); NotifyOfPropertyChange(() => CanMyClick); } } public bool CanMyClick { get { return !string.IsNullOrEmpty(_Mytxt); } } public void MyClick() { MessageBox.Show(_Mytxt); } }
你會發現有一個MyClick方法和一個CanMyClick的布爾屬性,這就是控制button的IsEnable屬性這是Caliburn的一個規則
2.有參數的方法和控件元素綁定
有參數的方法關聯其實是一樣的
我們把上邊的例子做一下修改
先看一下效果圖 三個button調用 的同一個方法
看一下前台頁面如何調用同一個方法
<Window x:Class="CalibrunMicAction.AppView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:cal="http://www.caliburnproject.org" Title="AppView" Height="300" Width="300"> <StackPanel> <TextBox x:Name="Mytxt" /> <Button Height="30" Margin="0,3" Content="Click Me"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <cal:ActionMessage MethodName="MyClick"> <cal:Parameter Value="{Binding ElementName=Mytxt,Path=Text}"/> <cal:Parameter Value="aaabbbccc"/> </cal:ActionMessage> </i:EventTrigger> </i:Interaction.Triggers> </Button> <Button Height="30" Margin="0,3" Content="Click Me2" cal:Message.Attach="[Event Click]=[Action MyClick($source,'aaaa')]"/> <Button Height="30" Margin="0,3" Content="Click Me3" cal:Message.Attach="[Event Click]=[Action MyClick($source,Mytxt.Text)]"/> </StackPanel> </Window>
我們把MyClick方法改成兩個參數的方法一個是object類型一個是string類型
注意:第一個button和第三個button都是把textbox的text元素當做參數傳給MyClick方法只是兩種不同的寫法
$source等會我再詳細說它是綁定的控件本身在這個demo里就是button從彈出來的提示你也可以看出來。
再看一下ViewModel是怎么操作的
[Export(typeof(IShell))] class AppViewModel: PropertyChangedBase,IShell { private string _Mytxt; public string Mytxt { get { return _Mytxt; } set { _Mytxt = value; NotifyOfPropertyChange(() => Mytxt); NotifyOfPropertyChange(() => CanMyClick); } } public bool CanMyClick { get { return !string.IsNullOrEmpty(_Mytxt); } } public void MyClick(object str,string str2) { MessageBox.Show(str.ToString()+" "+str2); } }
我們說一下上面看到的$source Caliburn.Micro提供了一些定義好的參數(不區分大小寫)供我們在傳遞時用 ,當然我們也可以自定義我們自己的參數
$eventArgs — — 將觸發器的 EventArgs 或輸入的參數傳遞到您的行動。
$dataContext — — ActionMessage 附加到的元素的 DataContext
$source — — 觸發 ActionMessage 的控件
$view -綁定到 ViewModel 視圖 (通常是用戶控件或窗口)。
$executionContext -包含上述所有信息和更多的行動的執行上下文。
$this -行動所附加到的實際用戶界面元素
這個$this感覺和$dataContext沒什么區別
如果想自定義參數可以寫到用這個方法MessageBinder.SpecialValues進行擴展
我們來寫一個自定義的參數
要在 Mybootstrapper的config里寫
怎么用呢,我們在原來的例子上再加上一個button
<Button Height="30" Margin="0,3" Content="Click Me4" cal:Message.Attach="[Event Click]=[Action MyClick($mysender,Mytxt.Text)]"/>
看一下它彈出來什么
細心的人會發現它和$source彈出來的是一樣的。
這是Caliburn.Micro Action的源碼,默認的是Click和控件的LeftMouseButtonDown事件,有時間你可以詳細讀一下它的源碼
Demo源碼:CalibrunMicAction.rar