我有自定义的TextBox,它只接受浮点作为输入。我使用双向模式将其绑定到浮点属性(自定义依赖属性)。它使用自定义转换器进行字符串转换以使之浮动,反之亦然。如果我不格式化字符串,显然它会显示这样的值,比如3,141592653.在逗号后面有太多的数字,我想显示两个小数位,但是保留了精确值的实际数据。但是,当我尝试运行它时,如果我显式地设置转换器,则字符串格式将无法工作,除非我删除转换器属性,否则它将工作。因此,我可以选择保留转换器或字符串格式。
我需要那个转换器,因为wpf的默认转换是不够的。它将空字符串转换为0,并接受点和逗号作为小数点分隔符。那么,如何使我的自定义文本框同时完成字符串格式和转换器的工作呢?
下面是我的自定义TextBox (称为DoubleBox)的相关代码
我的自定义TextBox XAML (DoubleBox.XAML)
<TextBox ...
Name="Root">
<TextBox.Text>
<Binding ElementName="Root"
Path="DoubleValue"
Mode="TwoWay"
UpdateSourceTrigger="Explicit"
Converter="{StaticResource DoubleToString}"
StringFormat="{}{0:f2}">
<Binding.ValidationRules>
<validationrules:MyDoubleValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
我的自定义TextBox代码-隐藏(DoubleBox.XAML.cs)
public partial class DoubleBox : TextBox
{
// constructor
public double DoubleValue
{
get { return (double)GetValue(DoubleValueProperty); }
set { SetValue(DoubleValueProperty, value); }
}
public static readonly DependencyProperty DoubleValueProperty =
DependencyProperty.Register(nameof(DoubleValue), typeof(double), typeof(DoubleBox), new PropertyMetadata(0.0));
// method that does the binding update source trigger
// (when focus is lost and enter key is pressed)
}
我的双串转换器
public class DoubleToString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((double)value).ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string str = (string)value;
if (string.IsNullOrEmpty(str))
return 0;
str = str.Replace('.', ',');
if (str.StartsWith(','))
str = "0" + str;
return double.Parse(str);
}
}
编辑以获得更多澄清:
我已经尝试过格式化双字符串转换方法中的double值。在将它转换为字符串之前,我可以先对它进行舍入,即return Math.Round(((double)value), 2).ToString();
,它正确地显示了两个小数点浮点数,但请记住这是一个文本框:用户可以修改textbox本身的值,因此它是一个TwoWay数据绑定。
一旦我将焦点交给TextBox --它不显示所有浮点精度,它仍然显示2小数点浮点数--所以当我试图失去焦点时,TextBox将它转换回原来的double属性,即格式化的值,即2小数点浮点数,因此丢失了精度,因此这种方法不适用于TwoWay绑定。
下面是一个视频链接,说明如果我在双字符串转换方法中格式化字符串,那么它在我的项目中的表现:https://media.giphy.com/media/7wWVlzl3orIeVl3G2B/giphy.gif
发布于 2022-10-11 06:43:07
我从另一个角度看这个问题,解决了这个问题。它确实实现了我想要的结果,即显示格式化的值(仅当焦点丢失时)并进行转换。
我没有尝试使字符串格式和转换器工作,而是使用了当焦点丢失时激活的触发器。触发器将Text属性设置为格式化字符串,这样文本只在没有焦点时才显示格式化的字符串,但当给定焦点时,则显示实际值。
下面是更新的DoubleBox.XAML XAML。实际上,它现在是一个UserControl,在我的代码中,它将实际的TextBox放在UserControl中,不再修改TextBox,但是方法仍然一样,使用触发器在焦点丢失时显示格式化的字符串。
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text">
<Setter.Value>
<Binding ElementName="Root"
Path="DoubleValue"
Mode="TwoWay"
Converter="{StaticResource DoubleToString}"
UpdateSourceTrigger="Explicit">
<Binding.ValidationRules>
<validationRules:DoubleValidationRule/>
</Binding.ValidationRules>
</Binding>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsFocused" Value="False">
<Setter Property="Text">
<Setter.Value>
<Binding ElementName="Root"
Path="DoubleValue"
Mode="OneWay"
StringFormat="{}{0:f2}">
</Binding>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
https://stackoverflow.com/questions/74022281
复制相似问题