所以我尝试创建我的第一个Windows应用程序,并且它没有按预期进行。 甚至不确定什么是存储数据的最佳方式,目前我正在使用JSON,但我也可以使用YAML甚至直接将它们存储在组合框中
所以我有一个组合框:
<TextBlock Text="Select Currency:" TextWrapping="Wrap" VerticalAlignment="Center" Grid.Row="2" Grid.Column="1" Margin="5,0,0,0" Foreground="White"/>
<ComboBox x:Name="cbCurrency" VerticalAlignment="Center" HorizontalAlignment="Stretch" Grid.Row="2" Grid.Column="2" Margin="0,0,15,0" Foreground="White" Background="#6649586D" BorderBrush="#660B121D" SelectionChanged="Currency_SelectionChanged"/>
现在我需要传递存储在我的JSON文件中的数据,如下所示:
"CAD": {
"symbol": "CA$",
"name": "Canada Dollar",
"symbol_native": "$",
"decimal_digits": 2,
"rounding": 0,
"code": "CAD",
"name_plural": "Canadian Dollars"
},
组合框应该采用每个属性中的“名称”对象(CAD,USD,...) 我查了一下,但找不到关于JSON / YAML的有效解释,而不是DB或本地存储在Combobox中。如果有人可以帮助我使用JSON值填充这个组合框,或者告诉我是否有更好的方法来实现我的尝试,那会很高兴吗?
Ok Clint,再次感谢,最终设法使其适用于基于您的输出的Windows 10 UWP,它提供了以下代码,修复了我在System.IO.FileSystem中的注释“System.InvalidOperationException”中提到的错误。 dll“奇怪的是,我不得不将.json重命名为.txt以使其正常工作。
public class Currency
{
public string Name { get; set; }
public string Symbol_Native { get; set; }
public int Decimal_Digits { get; set; }
public string Code { get; set; }
}
public async void ParseCurrencies()
{
string fileName = "Currencies.txt";
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(@"ms-appx:///Assets/" + fileName));
var json = await Windows.Storage.FileIO.ReadTextAsync(file);
var dict = JsonConvert.DeserializeObject<Dictionary<string, Currency>>(json);
foreach (var keyValuePair in dict)
{
cbCurrency.ItemsSource = dict.Values;
///System.Diagnostics.Debug.WriteLine("Currency: {0}", keyValuePair.Key);
///System.Diagnostics.Debug.WriteLine("\tName: {0}", keyValuePair.Value.Name);
///System.Diagnostics.Debug.WriteLine("\tSymbol_Native: {0}", keyValuePair.Value.Symbol_Native);
///System.Diagnostics.Debug.WriteLine("\tDecimal Digits: {0}", keyValuePair.Value.Decimal_Digits);
///System.Diagnostics.Debug.WriteLine("\tCode: {0}", keyValuePair.Value.Code);
}
}
public MainPage()
{
this.InitializeComponent();
ParseCurrencies();
}
答案 0 :(得分:0)
您可以使用NewtonSoft.Json's nuget libary执行此操作。
以下代码演示了从JSON中获取数据的基础知识:
class Currency
{
public string Name { get; set; }
public string Symbol_Native { get; set; }
public int Decimal_Digits { get; set; }
public string Code { get; set;}
}
void Main()
{
var json = File.ReadAllText(@"C:\users\clint\desktop\common-currency.json");
var dict = JsonConvert.DeserializeObject<Dictionary<string, Currency>>(json);
foreach (var keyValuePair in dict)
{
Console.WriteLine("Currency: {0}", keyValuePair.Key);
Console.WriteLine("\tName: {0}", keyValuePair.Value.Name);
Console.WriteLine("\tSymbol_Native: {0}", keyValuePair.Value.Symbol_Native);
Console.WriteLine("\tDecimal Digits: {0}", keyValuePair.Value.Decimal_Digits);
Console.WriteLine("\tCode: {0}", keyValuePair.Value.Code);
Console.WriteLine();
}
}
这样做是将JSON读作字典,JSON.NET能够使用我所做的Currency
类来推断结构并提取出你想要的数据。
然后,您可以使用标准XAML绑定技术将货币列表绑定到组合框。
用于装订:
cbCurrency.ItemsSource = dict.Values;
=&GT;
<ComboBox x:Name="cbCurrency">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name, Mode=OneWay}" />
<TextBlock Text="{Binding Symbol_Native, Mode=OneWay}" />
<TextBlock Text="{Binding Decimal_Digits, Mode=OneWay}" />
<TextBlock Text="{Binding Code, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
^那应该展示你需要的基本结构。