2011-09-27 54 views

回答

4

老實說 - MVVM和數字文本框有什麼共同點?

如果您希望數字文本框創建新的TextBox或AttachedProperty或行爲。 Here是一個MaskedTextbox行爲的例子,以瞭解我的意思。

現在到您的MVVM部分。我假設你想驗證你的輸入只是數字。如果你的viewmodel有一個int類型的屬性,那麼你的綁定就可以工作,如果你的視圖有可轉換爲int的輸入。否則你的viewmodel將永遠不會被通知。現在有兩種方法:

第一:你確保你的視圖只需要數字輸入(使用數字文本框),而viewmodel屬性可以是int。

或第二種:您的viewmodel屬性類型是typeof字符串,並且您使用IDataErrorInfo讓視圖知道輸入何時不是數字。

+5

我將MVVM包含在其中的原因是,我看到了在後臺代碼中使用Preview Key事件的實現。我只是想消除這些答案 – katie77

+0

@Bindindis,我可以在那個大聲笑翻譯 –

0

那麼......如果你希望在你的viewmodel中通知數字文本框的文本屬性變化只是綁定到它。如果數字文本框的.Text屬性不是依賴項屬性,那麼編碼器!

這一個:http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown&referringTitle=Home

我可以推薦你可以從視圖模型通過綁定到它:

<!-- View: --> 
<NumericTextBox Text="{Binding MyViewModelTextStringProperty}" /> 
//ViewModel: 
public string MyViewModelTextStringProperty 
{ 
    get/set with NotifyPropertyChanged.... 
} 
1

通過MVVM的標準定義,你不會想要一個視圖模型背後自定義控件。你所要做的就是擴展TextBox控件,並確保只輸入數字輸入。您還應該添加一個返回數字輸入的DependencyProperty。

當在窗口或複合控件中使用該控件時,ViewModel會進入。您可以將Text或Numeric DependencyProperty綁定到ViewModel中的公共屬性。

0

如果你真的想在ViewModel中做到這一點,你必須讓你的綁定屬性成爲一個字符串。確保在每次擊鍵時綁定更新(使用UpdateSourceTrigger)。

在您的setter中,通過引發異常或修剪非數字字符來拒絕非數字值。後一種方法有利於複製/粘貼操作,其中粘貼的文本可能包含數字和字母的混合,但只有數字必須保留。這就是說,我同意其他建議,即擁有一個專門的控件只顯示一個數字屬性是一個更清潔的方法。

Regards,

Eric。

4

在WPF中,如果將TextBox綁定到Decimal或Int屬性,它將只接受該int或decimal,否則它將顯示一個紅色邊框,表明它在綁定中沒有適當的值。如果你正在談論數字updown文本框,那麼它是隨WPF工具包隨時可用here