天天看點

Caliburn.Micro學習筆記(二)----Actions

Caliburn.Micro學習筆記目錄

上一篇已經簡單說了一下引導類和簡單的控件綁定

我的上一個例子裡的button自動比對到ViewModel事件你一定感覺很好玩吧

今天說一下它的Actions,看一下Caliburn.Micro給我們提供了多強大的支援

我們還是從做例子開始

demo的源碼下載下傳在文章的最後

例子1.無參數方法調用

點選button把textBox輸入的文本彈出來

如果textbox裡沒有文本button不可點,看一下效果圖

Caliburn.Micro學習筆記(二)----Actions
Caliburn.Micro學習筆記(二)----Actions
看一下前台代碼

<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調用 的同一個方法

Caliburn.Micro學習筆記(二)----Actions

看一下前台頁面如何調用同一個方法

<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裡寫

Caliburn.Micro學習筆記(二)----Actions

怎麼用呢,我們在原來的例子上再加上一個button

<Button Height="30" Margin="0,3" Content="Click Me4" cal:Message.Attach="[Event Click]=[Action MyClick($mysender,Mytxt.Text)]"/>      

看一下它彈出來什麼

Caliburn.Micro學習筆記(二)----Actions

細心的人會發現它和$source彈出來的是一樣的。

這是Caliburn.Micro  Action的源碼,預設的是Click和控件的LeftMouseButtonDown事件,有時間你可以詳細讀一下它的源碼

Caliburn.Micro學習筆記(二)----Actions

 Demo源碼:CalibrunMicAction.rar

作者:李鵬

出處:http://www.cnblogs.com/li-peng/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。