2009-12-10 57 views
13

我正在開發基於WPF的應用程序。環境是使用.NET 3.5 SP 1的VS2008 SP1。 在我們的開發中,我們廣泛使用MVVM模式。在編譯時驗證XAML中的數據綁定

I.e.應用程序開發人員編寫Models和ViewModels(C#),然後UI開發人員將使用WPF綁定(XAML)編寫視圖。應用程序開發人員還在ViewModel之上編寫單元測試。 我們正在使用持續集成方法,並且我們正在構建和執行每個修改的單元測試。

問題是缺少XAML中的數據綁定正確性驗證過程或工具。 例如:

  1. 應用開發者編寫屬性NmberOfApples和單元測試,以檢查它的正確的行爲
  2. UI開發者創建用戶控制,並將其綁定到屬性
  3. 應用開發者發現,性能有拼寫錯誤和修復它的名字NumberOfApples
  4. 這將是彙編時間錯誤在任何C#代碼使用NmberOfApples屬性,並且這樣的錯誤將b E容易趕上(持續集成)
  5. 數據XAML文件中的結合不會被驗證,它將會運行時錯誤

我的問題將是「有沒有幫助我們進行驗證的任何工具或方法XAML在編譯時的數據綁定正確性?「

+0

我已經發現,我已經發布了您的問題的副本。 :( http:// stackoverflow。com/questions/43208011/detect-in-xaml-broken-bindings-already-at-compile-time 但是我已經成爲一個很好的解決方案!我不會在這裏發佈解決方案,因爲它不是來自我的,否則就是剽竊。 – Rekshino 2017-04-28 06:41:55

回答

9

您的問題的解決方案在article中討論。

基本的想法是創建一個ViewModel MetaData靜態(c#)類的集合,它包含ViewModel類的屬性的字符串值,然後您可以在xaml中使用它們。文章解釋瞭如何使用T4文本生成來創建這些靜態元數據類。您可以使用您的偏好的任何代碼生成工具。

讓你的虛擬機有以下幾點:

namespace Mine 
{ 
    public class MyViewModel 
    { 
    public int MyInt {get;set;} 
    public string MyString {get;set;} 
    } 
} 

你的代碼生成會造成這樣的:

namespace Mine.MetaData 
{ 
    public static class MyViewModelMetaData 
    { 
    public const string MyInt = "MyInt"; 
    public const string MyString = "MyString"; 
    } 
} 

,然後在你的XAML則可以將命名空間添加到您的XAML和綁定您的控件元數據類

<TextBox Text="{Binding Path={x:Static Metadata:MyViewModelMetadata.MyInt}}"/> 

如果使用外接樣resharper然後它會給你關於靜態類的屬性的智能感知,也因爲你在靜態類中引用了一個確切的屬性,當靜態類重新生成時,你的xaml不應該編譯。

這很漂亮,我認爲它很棒,它有保持大多數人健康的機會,但是你的里程可能會有所不同。 :)

編輯:

順便說一句,我不買「的ViewModels緊密耦合到的意見」。在我看來,Views與他們的ViewModel有着不可分割的聯繫,但它只能是一種方式。 ViewModels應該完全獨立於任何視圖實現。這就像ViewModel是接口,View是具體的實現類。所以出於這個原因,我沒有把任何WPF特有的屬性(例如,可見性枚舉)放到我的ViewModel中,因爲這會綁定我使用永久的WPF(這不是一件壞事:)),但它會影響維護。

+1

這是偉大的方法,謝謝你指出它。我會繼續解決這個問題幾天,以防萬一有人想分享其他技巧。 – 2009-12-18 18:15:27

+0

@Jose如果你沒有在視圖模型中保留「visibility」等屬性,你怎麼改變UI組件的可見性,因爲你不能在XAML中嵌入條件邏輯? – 2016-09-04 19:04:29

1

有許多可以說是很好的場景,其中這種行爲實際上是所需的。在任何情況下,它的設計都是綁定吞下錯誤,這就是你無法找到任何有助於解決這個問題的原因。

我見過的最好的事情是個例外驗證處理程序,將顯示綁定錯誤: http://msdn.microsoft.com/en-us/library/system.windows.controls.exceptionvalidationrule.aspx

這樣做的理由是觀點和的ViewModels是爲了去耦,其中可以使用的角度來看對於多個ViewModels。它還有助於視圖的「可彎曲性」,因此理論上設計器類型可以設計視圖而不會在執行視圖時遇到大量錯誤。我意識到這可能不適合你的過程,但這就是故事。

+0

我知道讓View和ViewModel解耦是很酷的。這裏的問題,我如何驗證他們的「兼容性」。 – 2009-12-11 18:30:49

+0

是的...我知道那是你的問題。那是「可以說」的。不幸的是,我認爲你將不得不專注於ExceptionValidationRule可能的和自動化的UI測試。我知道這有點蹩腳。 – 2009-12-11 19:04:07

-1

我同意上一個答案。這是「按設計」,無法在編譯時檢查它。

我也發現它很痛苦。

我發現的最好也是唯一的方法是在運行時檢查Visual Studio調試輸出。打開包含該窗口的窗口後,將立即打印任何綁定錯誤。

我同意如果你認爲這是一個糟糕的和不可靠的方法,但它應該工作,如果你沒有大量的窗口。您可以創建一個半正式的測試練習,您偶爾會打開任何專門尋找綁定錯誤的窗口。

+0

您是否建議手動遍歷所有應用程序窗口? – 2009-12-15 18:31:16

0

目前我們使用Caliburn和單元測試的方式在本文中解釋Testing Bindings In WPF。這個解決方案的缺點是,UI開發人員編寫的代碼只能驗證綁定,如果MS(或某人)會編寫XAML驗證編譯器,則可以省略該代碼。

2

如果您安裝了ReSharper,您將獲得的許多功能之一是「代碼檢查」。檢查將檢測到的一件事是綁定不能解析爲數據上下文中的屬性的情況。您可以輕鬆過濾「檢查結果」窗口以僅顯示這些問題。

請注意,您必須在您的XAML資源中明確聲明您的視圖模型的類型才能使其工作。

Example of ReSharper inspections

1

它已經多年,因爲原來的問題被提出和回答,但正如我剛纔檢查,該解決方案可能會變得從那時起簡單。 ReSharper似乎提供了正確的Intellisense,而無需生成接受的答案中提到的靜態類。

但我沒有目睹接受的答案中所述的編譯時錯誤。我甚至嘗試使用[XamlCompilation(XamlCompilationOptions.Compile)]無濟於事。如果我錯過了某些東西,請糾正我的錯誤。