2011-04-05 26 views
18

我一直在玩Caliburn Micro MVVM框架,並且在守衛方法方面存在一些問題。Caliburn微衛士不評估財產變化的方法

我有一個視圖模型:

public class MyViewModel : PropertyChangedBase, IMyViewModel 

的屬性:

public DateTime? Date 
{ 
    get{return this.date; } 
    set 
    { 
     this.date = value; 
     this.NotifyOfPropertyChange(() => Date); 
    } 
} 

而且,我在我的視圖模型與保護方法

public void Calculate() 
{ 
    // ..some code.. 
} 

public bool CanCalculate() 
{ 
    return this.Date.HasValue; 
} 

而一個方法按鈕在我看來:

我遇到的問題是CanCalculate方法在加載時執行,但是當我在文本字段中輸入值時,它不重新評估CanCalculate方法。我在設置數據綁定視圖模型屬性時觸發了屬性更改事件,因此可能是什麼問題?

+0

你能顯示代碼爲視圖,以及您在視圖模型中調用NotifyOfPropertyChanged方法的位置? – devdigital 2011-04-05 08:39:26

+1

@devdigital確定我已更新 – Charlie 2011-04-05 16:23:18

回答

33

好吧,我想通了。我沒有意識到你必須解除守衛方法的通知,認爲框架這樣做,但它是有道理的。

所以,我改變我的屬性setter到:

public DateTime? Date 
{ 
    get 
    { 
     return this.date; 
    } 
    set 
    { 
     this.date = value; 
     this.NotifyOfPropertyChange(() => Date); 
     this.NotifyOfPropertyChange(() => CanCalculate); 
    } 
} 

,並改變了我的CanCalculate方法屬性:

public bool CanCalculate 
{ 
    get 
    { 
     return this.Date.HasValue; 
    } 
} 

而且所有的工作現在罰款:)

+3

CanCalculate是一種方法你做了什麼來使它工作 – GorillaApe 2012-11-26 19:01:51

+3

只要把它變成一個具有getter的布爾屬性。 – 2013-03-03 18:34:01

+0

對於任何遇到這種情況的人都試圖使用參數對guard方法進行操作:如果參數對象包含在另一個屬性中(例如,一個集合綁定到一個列表框,而guard是每個項目),則可以通知屬性(看似)不相關的財產改變了。 – 2015-04-20 07:00:32

0

我假設這些通過Command(圍繞什麼是調用這些方法將有所幫助)調用。

如果您遇到的情況是您希望根據某些輸入重新評估命令,則需要調用CommandManager.InvalidateRequerySuggested()以便命令CanExecute將被調用。由於命令綁定到按鈕而不是文本框,它不會更新。在你的屬性設置器(綁定到文本框的屬性)中,你必須告訴框架重新查詢命令。這反過來會調用你的CanCalculate方法。

如果Calculate和CanCalculate方法沒有與命令關聯,那麼上面的內容將無濟於事。

+0

Caliburn Micro似乎忽略了CommandManager.InvalidateRequerySuggested(),實際上是一個監督的位。 :/ – 2013-03-26 13:17:24

+3

這不是一個疏忽。 Caliburn.Micro根本不使用'Commands' - 它具有'Actions' /'ActionMessages'。 – mnn 2014-01-19 02:39:38

2

如果你不需要CanExecute成爲方法,因爲你不會使用參數。然後你可以用標準通知和只有getter來重寫它。當你把getter變成結果時調用它的PropertyChanged。