2012-09-10 48 views
5

我是MVVM的中等新手,我理解MVVM相對於xaml後面的簡單代碼(例如VM的可測試性)的一些優點。我們使用Caliburn Micro來執行一些綁定,但這是無關緊要的,我可以使用特定綁定{綁定...},我的問題或多或少會保持不變。編譯時間檢查綁定?

我明白虛擬機應該對V無所謂的邏輯,如果一切正常完成的話,但似乎是因爲我們使用V和VM之間的動態運行時綁定,編譯器可以不做任何檢查每個綁定表達的合法性。例如,如果我有一個名爲UserName的UI組件,則Caliburn將嘗試在運行時將其綁定到名爲UserName的VM屬性(類似於執行類似於Value =「{binding UserName}」的操作)。但是,如果我重命名我的虛擬機屬性或拼寫UI組件名稱或綁定表達式,我們沒有得到任何指示,直到運行時間的問題。

在我看來,能夠告訴xaml一個UI組件或頁面將被綁定到一個特定的接口是非常好的,這樣編譯器就可以完成一些其他工作由測試部門完成(並重做)(這是我經常使用的)。

有沒有辦法告訴xaml我們綁定到一個接口或對象類型?是否有一些工具可以插入xaml應用程序來驗證綁定?

回答

4

雖然編譯器不提供對XAML的編譯時間檢查的支持,你也許可以通過編寫實例通過XAMLReader類中的每個XAML文件的自定義生成任務,然後使用custom TraceListener監聽實現幾乎相同的結果綁定錯誤。除此之外,如果您準備使用代碼進行數據綁定,則可以創建直接引用屬性名稱的綁定。類似以下內容(未經測試)

Binding createBinding<TProperty>(Expression<Func<TProperty>> property, object source) 
{ 
    MemberExpression me = property.Body as MemberExpression; 
    if (me == null || me.Expression != property.Parameters[0] 
      || me.Member.MemberType != MemberTypes.Property) { 
     throw new InvalidOperationException(
      "Now tell me about the property"); 
    } 
    Binding b = new Binding(me.Member.Name); 
    b.Source = source; 

    return b; 
} 

// sample code 
Binding b = createBinding(()=>this.FontSize, this); 
textBlock1.SetBinding(TextBlock.FontSizeProperty, b); 
-1

通過在運行時在輸出窗口中查找綁定錯誤,可以輕鬆檢查是否有任何綁定失敗。您可能需要設置綁定到詳細信息的調試信息。

+0

-1:OP在編譯時明確要求解決方案。 –

+0

aha ...這是一個替代 –

+3

它不是。 OP已經知道這一點,不想使用它。 –