2012-09-24 54 views
1

我在卡利微視圖和視圖模型如下:爲什麼caliburn微調用這種方法,當它不應該這樣做?

觀點:

<Canvas> 

     <Rectangle x:Name="CloseApp" Canvas.Top="0" Canvas.Left="0" Fill="green" Opacity="0.2" Height="20" Width="30" /> 
      <Rectangle x:Name="MoveWindow" Canvas.Top="0" Canvas.Left="60" Fill="red" Opacity="0.2" Height="20" Width="964" cal:Message.Attach="[Event MouseLeftButtonDown] = [Action MoveWindow]" /> 
</Canvas> 

和視圖模型

/// </summary> 
    public void MoveWindow() 
    { 
     Window view = this.GetView(null) as Window; 

     if (view != null) 
     { 
      view.DragMove(); 
     } 
    } 
    public void CloseApp() 
    { 

    } 

我注意到,當我點擊紅色矩形並拖動它,之後我發佈了左鍵,Caliburn微調了CloseApp。

爲什麼它應該這樣調用這個方法?

編輯1:

我發現,如果綠色矩形從左側開始= 1(canvas.Left = 「1」),這不會發生。

+0

很奇怪。原因似乎是對'view.DragMove()'的調用。沒有那條線,'CloseApp'沒有被調用。 –

回答

2

如果您沒有明確指定要附加的消息,Caliburn.Micro會回退到基於約定的命令模型,它會在VM上查找與控件名稱匹配並自動連接的方法。它會自動連接到一些事件來做到這一點。要覆蓋它,請更改Rectangle的名稱「CloseApp」或在Rectangle「CloseApp」上添加您自己的操作消息,或者更改名爲CloseApp()的方法的名稱。

接下來的事情 定位爲會展綁定元素後ViewModelBinder確實是檢查它們 比賽對視圖模型的方法。它通過使用 反射來獲取ViewModel的公共方法。然後它會循環搜索 ,查找與元素不區分大小寫的名稱。 如果找到匹配,並且元素上沒有任何預先存在的 Interaction.Triggers,則附加一個操作。用於預先存在的觸發器的檢查 用於防止約定系統 創建重複動作,以使開發人員可以在標記中明確聲明 。爲了安全起見,如果您有 在匹配的元素上聲明瞭任何觸發器,它將被跳過。

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions&referringTitle=Documentation

相關問題