首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >wpf TextBox绑定字符串格式+转换器不希望一起工作

wpf TextBox绑定字符串格式+转换器不希望一起工作
EN

Stack Overflow用户
提问于 2022-10-11 02:18:50
回答 1查看 66关注 0票数 0

我有自定义的TextBox,它只接受浮点作为输入。我使用双向模式将其绑定到浮点属性(自定义依赖属性)。它使用自定义转换器进行字符串转换以使之浮动,反之亦然。如果我不格式化字符串,显然它会显示这样的值,比如3,141592653.在逗号后面有太多的数字,我想显示两个小数位,但是保留了精确值的实际数据。但是,当我尝试运行它时,如果我显式地设置转换器,则字符串格式将无法工作,除非我删除转换器属性,否则它将工作。因此,我可以选择保留转换器或字符串格式。

我需要那个转换器,因为wpf的默认转换是不够的。它将空字符串转换为0,并接受点和逗号作为小数点分隔符。那么,如何使我的自定义文本框同时完成字符串格式和转换器的工作呢?

下面是我的自定义TextBox (称为DoubleBox)的相关代码

我的自定义TextBox XAML (DoubleBox.XAML)

代码语言:javascript
运行
复制
<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)

代码语言:javascript
运行
复制
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)
}

我的双串转换器

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

发布于 2022-10-11 06:43:07

我从另一个角度看这个问题,解决了这个问题。它确实实现了我想要的结果,即显示格式化的值(仅当焦点丢失时)并进行转换。

我没有尝试使字符串格式和转换器工作,而是使用了当焦点丢失时激活的触发器。触发器将Text属性设置为格式化字符串,这样文本只在没有焦点时才显示格式化的字符串,但当给定焦点时,则显示实际值。

下面是更新的DoubleBox.XAML XAML。实际上,它现在是一个UserControl,在我的代码中,它将实际的TextBox放在UserControl中,不再修改TextBox,但是方法仍然一样,使用触发器在焦点丢失时显示格式化的字符串。

代码语言:javascript
运行
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74022281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档