繁体   English   中英

wpf字符串格式c#用于测量单位

[英]wpf string format c# for measurement units

我正在使用MVVM模式和Entity Framework来创建一个应用程序。 我有一个名为ScaleRange的实体,它具有以下属性:UpperRange(以克或毫克为单位,整数类型),LowerRange(以克或毫克为单位,整数类型)和精度(以克或毫克为单位,十进制类型)。 我以克为单位将所有属性保存在数据库中(或者我应该?)。 问题是当我需要在DataGrid中显示ScaleRange列表时,所有属性都以克表示(因为数据是从数据库中提取的),并且在某些情况下值为0.0001(以克为单位)我更喜欢为了更好看的毫克(在这种情况下为0.1)。 是否存在某种字符串格式,例如,如果值<0.01,则以毫克显示,否则以克为单位显示?

这是DataGrid的代码(现在工作正常)

<DataGrid Grid.Column="3" Grid.Row="1" Grid.RowSpan="4" AutoGenerateColumns="False" ItemsSource="{Binding Scale.Ranges}" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Upper range" Width="*" Binding="{Binding UpperRange, StringFormat={}{0}g}"></DataGridTextColumn>
            <DataGridTextColumn Header="Lower range" Width="*" Binding="{Binding LowerRange, StringFormat={}{0}g}"></DataGridTextColumn>
            <DataGridTextColumn Header="Precision" Width="*" Binding="{Binding Precision, StringFormat={}{0}g}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

我创建了这个转换器,它适用于单位前缀G,M,K,m,μ,n

它没有经过彻底的测试,所以让我知道任何问题,只需仔细检查你的值是否符合预期。

class GramToAppropriateUnitPrefixConverter : IValueConverter
{
    private List<string> unitsPrefix = new List<string>() //unit prefixes scalings by *10^3 in order, where the middle value is = *10^0
    {
        "G",
        "M",
        "k",
        "",
        "m",
        "μ",
        "n"
    };

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value is double number)
        {
            string numAsString;
            int sigFigs = 3;
            string unit = "g";
            int noPrefixIndex = (unitsPrefix.Count / 2);
            int unitsPrefixIndex = noPrefixIndex;

            numAsString = number.ToString("G" + sigFigs.ToString()).Replace("+", ""); //Convert to $sigFigs number of significant figures
            string[] numberStandForm = numAsString.Split('E'); //Convert to standard form (number = [0] * 10^[1])

            if (numberStandForm.Count() == 2)
            {
                unitsPrefixIndex = noPrefixIndex +(int.Parse(numberStandForm[1]) / 3);

                //Check the index is not out the range of the list
                if (unitsPrefixIndex < 0)
                    unitsPrefixIndex = 0;
                else if (unitsPrefixIndex > unitsPrefix.Count - 1)
                    unitsPrefixIndex = unitsPrefix.Count - 1;

                //Change the standard form number so it is in the form ->   number * 10^(multipul of 3)
                var power = int.Parse(numberStandForm[1]) + ((unitsPrefixIndex - noPrefixIndex) * 3);
                string numberStr = (double.Parse(numberStandForm[0]) * Math.Pow(10, power)).ToString();
            }

            numAsString = numberStandForm[0] + unitsPrefix[unitsPrefixIndex] + unit;

            return numAsString;
        }

        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

}

您可以使用转换器, 是一个快速概述。
Convert功能中,您可以添加逻辑以确定值是否<0.1并相应地修改它。
你真的不需要ConvertBack函数,因为它是一个单向绑定。

如果让值转换器类派生自MarkupExtensionYourConverter : MarkupExtension, IValueConverter )并覆盖ProvideValue函数,就像这样

public override object ProvideValue(IServiceProvider serviceProvider)
{
     return this;
} 

您可以将XAML代码中的集成简化为{Binding Converter={conv:YourConverter} ,而不必首先将转换器定义为资源。
您还必须添加对转换器命名空间的引用,在我的示例中为conv:例如xmlns:conv="clr-namespace:Content.Common.Converter" )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM