2015-10-10 77 views
0

我創建了Coverter,它僅用於TextBoxes的數字驗證。 一切都很好,我在很少的地方使用它,但有一個地方,它只是不工作,我debbuged它,它開始工作,就像它是模式OneTime。轉換器不想只在一種情況下工作

轉換器:

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var val = value.ToString(); 
     return (string.IsNullOrEmpty(val) ? "" : ((val.Substring(val.Length - 1).Equals(",") && val.Count(x => x == ',') < 2) || char.IsDigit(System.Convert.ToChar(val.Substring(val.Length - 1))) ? val : val.Substring(0,val.Length-1))); 
    } 

而且我不知道,如果它的問題,但有一段時間,在窗口中使用,而第二次頁,它不會在頁面工作。 Page:

   <TextBox Name="PeselTextBox" 
       Margin="2,5" 
       Width="70" 
       VerticalAlignment="Center" 
       Text="{Binding ElementName=PeselTextBox, 
           Path=Text, 
           Mode=OneWay, 
           UpdateSourceTrigger=PropertyChanged, 
           Converter={StaticResource NumberValidationConverter}}"/> 

而在窗口中它是一樣的。 試圖尋找解決方案,但我只是不明白這個錯誤。

+0

作爲備註:您的驗證在至少兩種情況下不起作用:***複製並粘貼***和***在實際輸入***之前移動插入符號*** - 不會假定它始終保留在TextBox的末尾。我已經在Window和Binding中嘗試了你的代碼(不只是一次),所以很奇怪聽到它不適合Page。 –

+0

「綁定」是指定義元素本身。爲什麼? – Sandesh

+0

@KingKing它實際上在其他頁面中工作,只在其中沒有。 – Zeronader

回答

0

首先,不要使用轉換器進行驗證。這不是他們打算或擅長的。如果你需要驗證,看看Using IDataErrorInfo in M-V-VM

這就是說,你正在使用模式OneWay。這意味着綁定所做的唯一事情就是反映視圖模型中的變化(通過PropertyChanged),其中不應該需要經過驗證!如果要在將更改應用到視圖模型之前進行轉換,請使用ConvertBack方法和模式TwoWayOneWayToSource

+0

我知道它應該用IDataError來完成,但我仍然在學習MVVM,而且這個項目仍然在代碼後面,所以在這裏沒有任何viewmodel。但是我想要比textChanged事件 – Zeronader

+0

@Zeronader更好地驗證一些效果,那麼你顯然將你的代碼隱藏用作視圖模型(或者你的綁定根本不起作用)。無論如何,最好立即開始良好的實踐!有一個適當的視圖模型將有助於使未來的工作更容易。 – BradleyDotNET

相關問題