2016-12-06 22 views
2

正在學習Catel。Catel Person應用示例

在Catel.Examples的PersonApplication中 - 具體來說,PersonWindow.xaml:設計時間數據未在Visual Studio Designer中顯示。

在PersonViewModel的代碼中,公共屬性被註釋掉了。顯然這是因爲代碼使用Fody在運行時創建Model屬性。因此,假設Visual Studio Designer要求公共屬性在Designer中顯示設計時數據,我取消了對公共屬性的註釋。儘管如此,DesignPersonViewModel的設計時數據並未在設計器中顯示。

應用程序在運行時正確運行。 Building上沒有消息表明XAML或代碼中存在問題。該XAML代碼聲明設計時的datacontext是正確的:

d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel, 
           IsDesignTimeCreatable=True}" 

爲什麼在設計時數據不會在設計表現出任何解釋?

我使用Visual Studio 2015年

回答

1

但是我對Catel的框架強勁升值,我也目睹了這一奇怪的行爲

看來,依賴屬性沒有連接到[產品型號]裝飾性能。但是,雖然應該修復它,但可以直接設置依賴項屬性。

public PersonViewModel(Person person) // this approach works 
{ 
    // Person = person ?? new Person(); 
    // The following 2 lines provide DesignTime data 
    SetValue("FirstName", "Joe"); 
    SetValue("LastName", "Dalton"); 
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute); 
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute); 
} 

public PersonViewModel(Person person) // this approach does not work 
{ 
    // Person = person ?? new Person(); 
    Person = new Person() { FirstName = "Joe", LastName = "Dalton" }; 
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute); 
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute); 
} 
+1

非常好。這工作。我想知道爲什麼Geert沒有修復這些代碼。雖然對Catel留下了深刻的印象。但是,這是一個相當不錯的學習曲線 - 考慮到它的能力,仍然值得。 謝謝,胡里奧。 –

1

第二個示例要求視圖模型調用更多的邏輯(模型來查看模型映射)。原因是您期望設計時間視圖模型能夠在設計時自動執行模型映射。雖然我們可以實現它,但這沒有多大意義。

設計時間視圖模型應該是非常輕便和簡單的視圖模型,只是爲了在設計器中顯示一些虛擬數據。它們不應該在運行時充當功能完整的視圖模型,因爲它會減慢設計器的速度,並且在出現異常情況時可能會使設計器崩潰。

從我的頭頂開始,我們甚至檢查我們是否在設計師身邊運行,如果是的話,跳過一些邏輯。

因此,雖然這看起來像一個錯誤,但它的設計是因爲設計時視圖模型應該簡單明瞭。我們建議,爲了設計目的,您可以創建一個非常簡單的命名約定,併爲ViewModelLocator添加一個額外的命名約定。例如:

if (CatelEnvironment.IsInDesignMode) 
{ 
    var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>(); 
    viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel") 
} 

這將使您的應用程序更喜歡MyPersonDesignTimeViewModel在設計模式,但應用程序運行時會加載還是實際的視圖模式。

請注意,這隻適用於視圖實際上會在設計時嘗試解析視圖模型的情況,我不知道從頭開始,因爲我從不使用設計時間。