Windows 10 App - 来自JSON的Combobox

时间:2017-06-17 21:53:30

标签: c# xaml data-binding combobox

所以我尝试创建我的第一个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();
    }

Dropdown

1 个答案:

答案 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>

^那应该展示你需要的基本结构。