[英]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
函數,因為它是一個單向綁定。
如果讓值轉換器類派生自MarkupExtension
( YourConverter : 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.