2013-06-19 44 views
0

我使用UpdateSourceTrigger.PropertyChanged将文本框绑定到整数。TextBox绑定:只从源更新一次

这似乎做工非常精细,除非我想改变让说1000至2000年 已经删除了1后,绑定是有点太聪明,截断文成一个0

我现在的解决方法是在经过一些过滤之后显式调用UpdateSource(),但它感觉不对。

是否有正确的方法来解决问题?

private void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (IsLoaded) 
     { 
      string text = ((TextBox)sender).Text; 
      if (text.Length <= 1 || !text.StartsWith("0")) 
      { 
       ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
      } 
     } 
    } 

    private void OnTestLostFocus(object sender, RoutedEventArgs e) 
    { 
     ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();      
    } 
+1

为什么不把'UpdateSourceTrigger'属性留作'Default'或'LostFocus'? – Dan

+0

因为我想更新验证并在输入值时进行脏检查。在这种情况下是合理的,相信我。 – Karsten

回答

2

绑定到一个int属性有它的缺点。如果在文本框中设置了无法转换为int的值,那么绑定将不起作用 - 您的setter不会被调用,即使转换器也不会被调用。

最简单的方法是在viewmodel中使用字符串属性并将值转换为模型中的int属性。为了验证你可以使用IDataErrorInfo。

像丹建议您可以将UpdateSourceTrigger设置为LostFocus。但是当你清除你的文本框时,这没有帮助;)

+0

我不认为这是正确的。你可以将TextBox的Text属性绑定到一个int,并且它会在没有Converter的情况下转换它(两种方式)。 –

+0

@Richard:我认为blindmeis不会说你不能将文本属性绑定到int。他说它有缺点,或者我误解了你的陈述? – srsyogesh

+0

也许我误解了解释。我从答案中得到了一个印象,即绑定到一个int不起作用,因为当你在文本框中设置文本时,它不会被转换为vm中的int,事实并非如此。 –