2016-02-03 16 views
0

說我有像這樣一類...結合動態物體時保持類型 - WPF/C#

public class Field 
{ 
    public Field(string fieldname, object fieldValue = null) 
    { 
     FieldName = fieldname; 
     FieldValue = fieldValue; 
    } 

    public string FieldName { get; set; } 
    public object FieldValue { get; set; } 

} 

而且我再結合以班級爲這樣...

<Label Width="Auto" Content="{Binding FieldlName}"></Label> 
<TextBox Width="Auto" Text="{Binding FieldValue, FallbackValue='error', UpdateSourceTrigger=PropertyChanged}"></TextBox> 

我遇到問題,如果FieldValue在後面的代碼中設置爲整數,但用戶在文本框中鍵入不同的整數,則類型將更改爲字符串。

然而,我所期望的是價值觀,以保持自己的類型。

我意識到問題是Text屬性是字符串,它試圖進行轉換。

因此,我正在尋找的是一種補救措施,以維持隱式類型,某種驗證,某種類型的轉換器,吸氣劑上的某些東西......這是我不完全確定的嗎?

+0

不知道爲什麼'FieldValue'必須是動態的,我可能會在其setter中放置一些類型轉換邏輯。 'Field'也可以實現'IDataErrorInfo',所以任何轉換失敗都會設置一個適當的錯誤。 –

+0

爲了澄清,我當時正在玩**對象**類型和**動態**類型之間的差異,當時我最初編寫問題的時候我正在使用** object **來將該值定義爲該值可以是字符串,int,double,datatime,bool等。 重要的是我可以保持它的類型。 – BrokenRobot

+0

它保持它的類型。 TextBox的Text屬性是一個字符串。 – Kevin

回答

1

文本框的值總是一個字符串,沒有辦法改變它(除非你使用不同的組件)。但是,在更新綁定屬性時,WPF綁定引擎會嘗試轉換類型。

當您的視圖模型的屬性類型爲string時,則目標類型與源的類型(文本字段的文本屬性)匹配,因此所有內容都只是更新。

因此,當您的視圖模型的屬性是int類型時,則無論您輸入到文本框中,都將嘗試將其轉換爲int。如果可行,那很好;如果它沒有更新視圖模型屬性,而是拋出一個綁定異常。

現在,當您的視圖模型的屬性是object型的,那麼當WPF試圖存儲字符串值到視圖模型的財產,那麼這只是工作。無論其以前的值(無論是int還是任何其他對象)。由於stringobject的子類型,因此引擎可以將字符串分配給object屬性,因此不會發生類型轉換。

+0

我更新了我的問題,以澄清我實際要求的內容,看起來並不像我第一次打算那麼明顯。 – BrokenRobot

+0

@TonyDasilva您將需要更改視圖模型的類型以獲得一些轉換。或者使它成爲一個字符串屬性,然後在其setter中,自己進行轉換並將其存儲在另一個屬性中。 – poke