TextBox聚焦与否时显示不同十进制精度的最佳方法?

时间:2014-01-28 15:28:39

标签: c# wpf

我有控制权,是别人使用的。它有一个绑定到十进制值的TexBox。由于精度可以变化,我使用DependencyProperty和MultiBinding来指定它。 当TextBox没有聚焦时,数字应该以指定的精度显示,但是当它聚焦时,应该显示完整的数字。

示例:

  • 精确度:2
  • 用户输入:29.333
  • 未聚焦的TextBox应显示:29.33
  • 专注于TextBox的应该显示:29.333

我通过使用IMultibindingConverter和IsFocused属性完成了这项工作。但我不知道这是否是最佳方法。

我的TexBox定义如下

  <UserControl.Resources>
        <conv:ValuePrecisionConverter x:Key="ValuePrecisionConverter" />        
    </UserControl.Resources>
       <TextBox x:Name="myTextBox">
                 <TextBox.Text>
                 <MultiBinding Converter="{StaticResource ValuePrecisionConverter}"  Mode="TwoWay"
     NotifyOnValidationError="true">
                     <Binding ElementName="parent" UpdateSourceTrigger="PropertyChanged" Path="Value" Mode="TwoWay" />
                     <Binding ElementName="parent" Path="Precision"/>
                     <Binding ElementName="parent" Path="AdditionalFormatting"/>
                     <Binding ElementName="myTextBox" Path="IsFocused" Mode="OneWay"/>
                     </MultiBinding>
                 </TextBox.Text>           
       </TextBox>

我的 ValuePrecisionConver 定义如下:

 public class ValuePrecisionConverter : IMultiValueConverter
    {
         public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            double? value = null;
            converter = null;

            value = System.Convert.ToDouble(values[0]);
            precision = System.Convert.ToInt32(values[1]);
            //Other code with 3rd parameter

            if (values.Count() > 3)
            {
                bool isFocused = System.Convert.ToBoolean(values[3]);

                if (isFocused)
                    return value.ToString();
            }

           /*Here I do the formating with the given precision*/
           return formattedValue;
        }


}

这是完成我需要的最佳方式吗?可以像这样使用IsFocused属性吗?

2 个答案:

答案 0 :(得分:0)

试试这个。

<TextBox x:Name="myTextBox">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="False">
                     <Setter Property="Text" Value="{Binding Value, StringFormat=n2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Trigger>
                <Trigger Property="IsFocused" Value="True">
                     <Setter Property="Text" Value="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                 </Trigger>
             </Style.Triggers>
        </Style>
   </TextBox.Style>
</TextBox>

答案 1 :(得分:0)

我希望您使用PreviewGotKeyboardFocus和PreviewLostKeyboardFocus进行事件触发...使用转换器设置值..此处不需要MuiltBinding ...