Caliburn.Micro學習筆記目錄
上一篇已經簡單說了一下引導類和簡單的控件綁定
我的上一個例子裡的button自動比對到ViewModel事件你一定感覺很好玩吧
今天說一下它的Actions,看一下Caliburn.Micro給我們提供了多強大的支援
我們還是從做例子開始
demo的源碼下載下傳在文章的最後
例子1.無參數方法調用
點選button把textBox輸入的文本彈出來
如果textbox裡沒有文本button不可點,看一下效果圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5COykTO3czM5ADZ5IzNiNDO1MDZ0YTYxEjYhRTZjljZh1yM1MTMxEjNw8CXxEzMxAjMvwVN5UjM0MzLcd2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
<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
作者:李鵬
出處:http://www.cnblogs.com/li-peng/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。