2015-10-10 78 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

相关问题