2013-04-07 22 views
1

我有一个几乎与 中描述的相同的问题WPF textbox binding not working when using stringformat 我有滑块和文本框。文本框绑定到滑动条的值属性,更新触发器onpropertychanged在toway模式下。我在文本框中检查用户输入,所以我只能输入数字或“ -/+”。 我的问题是,我不仅有整数,但也浮动值,我现在不会有点后点多少数字,所以我不想限制用户。 为此,我使用字符串格式D StringFormat=D,但是在那种情况下TextBox中没有可见的输出,但我仍然可以输入数字并且影响较小的值,但是当我移动滑块时 - 文本从文本框中消失。使用绑定在XAML中的TextBox中的点

我希望从滑块的值在文本框中可见,我没有限制在点后输入数字。我该怎么做? P.S.我正在使用.NET 4.5。

这里是我的转换器:

class ToStringConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      return value.ToString(); 
     } 
     return 0; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      float fvalue = System.Convert.ToSingle(value.ToString(), culture); 
      return fvalue; 
     } 
     return 0; 
    } 
} 

它显示值不错,但我不能输入值 - 它的崩溃,随时切换到最大值,而不是我想。

这里是我的XAML代码

<Page.Resources > 

     <settingsManager:RoundingConverter x:Key="RoundingConverter"></settingsManager:RoundingConverter> 
     <settingsManager:ToStringConverter x:Key="ToStringConverter"></settingsManager:ToStringConverter> 

    </Page.Resources> 

<TextBox x:Name="TextBoxFirstPersonCameraPositionX" Text="{Binding ElementName=SliderFirstPersonCameraPositionX, Path=Value, Mode=TwoWay, IsAsync=True, Delay=0, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ToStringConverter}}" 
             Width="100" VerticalAlignment="Center" Margin="10,0,0,0" FontWeight="Normal" MaxWidth="200" MinWidth="198" HorizontalScrollBarVisibility="Auto" MaxLength="40" DataObject.Pasting="TextBoxPasting" PreviewTextInput="OnPreviewTextInput" 
             > 
           </TextBox> 
+0

分享您当前的代码可以帮助他人快速解决您的问题 – Isantipov 2013-04-07 14:56:26

+0

我尝试过写我自己的转换器,但它不能正常工作: – Denis 2013-04-07 19:07:33

回答

0

首先,请尝试使用 “浮动” 和 “ToSingle” 被 “双规” 和 “ToDouble”。 Slider.Value是双重的,而不是浮动。

然后,Convert.ToSingle might throw a FormatException。你应该捕捉并处理这个异常。另外,OverflowException也是安全的。或者,也可以使用double.TryParse来避免第一个例外。

然后,转换时,你should always set一CultureInfo。你可能在一个不是“。”的系统上。但使用“,”来分隔小数。

要了解它崩溃的原因,请尝试以下操作:调试代码,按Ctrl-Alt-E并选中“Common Language Runtime Exceptions/Thrown”。然后,每当抛出异常时,例如一个FormatException,调试器停止,你可以看到发生了什么。