2010-08-11 57 views
3

我正在設計一個用戶控件來顯示一個筆記。所以我有一個NoteViewModel。在我的設計師中,我想要一個測試筆記。所以我在我的XAML中有以下幾種:XAML測試數據 - 設計人員可以轉換類型,但運行時不能

<UserControl.Resources> 
    <local:NoteViewModel x:Key="ViewModel" d:IsDataSource="True"> 
     <local:NoteViewModel.Note> 
      <localweb:Note 
       NoteID="1" 
       CreatedBy="Some Guy" 
       CreatedDate="2010-01-01 8:00 AM" 
       Category="Some Category" 
       NoteText="Some Text" 
       /> 
     </local:NoteViewModel.Note> 
    </local:NoteViewModel> 
</UserControl.Resources> 

這在設計時很有用。但在運行時,我遇到了無法將「1」轉換爲Int32的錯誤,並且無法將「2010-01-01 8:00 AM」轉換爲DateTime。爲什麼設計者能夠處理這個問題,而不是運行時?我應該如何更改XAML以便設計人員可以顯示測試筆記,但運行時不會崩潰?

+0

有關將「1」轉換爲Int32的錯誤尤其令人費解。 NoteID屬性是如何聲明的?你能透露它的代碼嗎? – 2010-08-18 22:01:31

+0

是的,NoteId代碼可以給出一些線索。我有像上面這樣一些奇怪的問題。 Style中可能會使用一些轉換器。 Silverlight不會檢測到這一點。因爲,樣式不會有DataContext。 我對silverlight設計時間和運行時間之間的偏差提出了有線答案。 Designer是基於WPF的。 – 2010-08-19 20:16:22

回答

0

設計者通常比標準運行時Xaml解析器更寬容。

我不明白爲什麼它不能將「1」轉換爲Int32,因爲int是原生解析Xaml中的幾個基本類型之一。您需要與TypeConverterAttribute來裝飾你的CreatedDate屬性: -

[TypeConverterAttribute(typeof(DateTimeTypeConverter))] 
public CreatedDate { get; set; } 

沒有這個XAML分析器並不真正知道如何處理的日期做。它變得更糟,因爲設計師將使用標準的UI文化來確定如何解析日期,而Xaml會經常使用不同的東西。我發現這個問題很棘手。

+0

DateTimeTypeConverter在System.Windows.Controls中。你是否說我不得不在我的業務邏輯層中引用它來裝飾類?這似乎......不幸的。 – RationalGeek 2010-08-12 13:41:39

+0

@jkohilhepp:'TypeConverterAttribute'具有另一個構造函數,它將類型的名稱用作轉換器,所以您可以使用此替代方法來避免附加引用。 – AnthonyWJones 2010-08-12 15:52:06

1

不知道爲什麼它正在發生,但與誠信來解決這個問題,你可以嘗試到指定值的NoteID的類型:

<localweb:Note xmlns:sys="clr-namespace:System;assembly=mscorelib" ...> 
     <localweb:Note.NoteID><sys:Int32>1</sys:Int32></localweb:Note.NoteID> 
    </localweb:Note> 

有點長,但是可能工作。

+0

那麼它已經足夠長,我不認爲我可以重新創建確切的場景來快速測試。但既然這似乎是一個好建議,我會給你賞金。 :-) 謝謝。 – RationalGeek 2010-08-22 16:30:44

+0

謝謝你,那是我的第一個賞金。 :) – 2010-08-25 20:09:48

相關問題