2013-08-07 71 views
2

在我的第一個項目嘗試Caliburn.Micro,我想了很多的東西:-)Command類

有一兩件事我很想念(或沒有帶尚未發現)是如何將視圖模型分開和一個命令。 CM不支持ICommand,因爲它的做事方式是superior。我相信這是真的,所以我會喜歡在正確的方向上做出小小的努力來實現這一目標,或者發現更好的方法。

據我所知,你必須將「Execute」方法和「CanExecute」屬性直接放在viewmodel中,命名爲匹配視圖中的控件,才能使魔法發揮作用。

我想將「Execute」和「CanExecute」放在視圖模型屬性的不同對象中,然後CM會像通常那樣使用控件名稱和屬性名稱自動綁定到該對象。

Repost來自Caliburn Micro論壇,我沒有得到任何答案,所以我在這裏嘗試我的運氣。

+0

您能否更清楚地詢問,您感到困惑的是什麼,或者您需要更多信息?我完全不理解你的問題,尤其是關於在不同的對象中放置「Execute」和「CanExecute」的最後部分? –

+0

聽起來就像你想創建一個命令處理程序類型的對象,它將用作命令的綁定源。你是否有理由直接在VM上使用CM約定和方法/道具?你能給這個優點嗎? – Charleh

+0

我想要這樣做的理由是爲了避免胖ViewModels。 – Karsten

回答

1

爲了避免使用ViewModels你也需要避免使用胖視圖。 Caliburn.Micro允許您按屏幕, Conductors and Composition中所述編寫Views/ViewModels。通過在MasterViewModel中定義DetailViewModel類型的屬性並在MasterView中添加一個以它命名的ContentControl,可以在「MasterView」/「MasterViewModel」外殼中包含一個「DetailView」和「DetailViewModel」對。綁定和操作像往常一樣工作,所以你避免了胖模型/視圖和命令的路由。

另一種選擇是通過將詳細信息的屬性添加到目標名稱來將MasterView元素綁定到DetailViewModel屬性或操作。我還找不到具體的URL,所以這個例子來自內存。

假設你有以下類別:

public class MasterViewModel:Screen 
{ 
    public property DetailViewModel MyDetails{get;set;} 
} 

public class DetailViewModel:Screen 
{ 
    public property string SomeText{get;set;} 

    public void DoTheBoogie(){} 
} 

您可以添加在你馬西德威命名控制 'MyDetails_SomeText' 綁定到DetailViewModel.SomeText。你也可以以同樣的方式綁定到DoTheBoogie。

我更喜歡創建一個單獨的視圖,名爲DetailView,並在MasterView中添加一個名爲「MyDetails」的ContentControl。這會產生更清潔和更模塊化的設計

1

您應該儘量避免使Law of Demeter無效。因此,在您的視圖模型,你可以有一個執行方法和CanExecute屬性(通常計算),而這些都可以調用到含有模型在適當情況下,如:

public void Save 
{ 
    // .. save logic 
} 

public bool CanSave 
{ 
    get 
    { 
     return this.model.CanSave ... and other logic etc. 
    } 
} 

你一定要記得通知的改變當可以保存狀態改變時的計算屬性,例如:

public void CodeThatGetsRunWhenAPropertyOfTheModelChanges() 
{ 
    this.NotifyOfPropertyChanged(() => this.CanSave); 
} 

如果您有例如在x:Name="Save"上查看Button,然後Caliburn.Micro將在點擊按鈕時自動在視圖模型上調用您的Save動詞,並在CanSave屬性值更改時自動啓用和禁用該按鈕。