json到windows store app C#中的新列表框项

时间:2013-03-03 09:18:01

标签: c# json xaml windows-8 listbox

我有一个Windows 8的应用程序需要带一个Json字符串并将其deseriaizes到DATACONTRACTS中它将在Listbox中显示我希望的信息,它将具有最大高度,并且如果大于最大高度将滚动。 / p>

我所拥有的问题不是无法做到,而是不知道如何去做。

到目前为止,我可以反序列化Json,我可以指定我希望每个项目进入UI的位置,但我想要做的基本上是对于数组中的每个项目,我希望它创建一个使用Textblocks格式化的新Stackpanel这将有来自Json的信息。不幸的是我不知道如何做到这一点我真的不知道我在寻找什么来获取如何做的教程

这是我的代码,它使用帮助器类从json获取项目并将它们放在TextBlocks的Text中。

var _FilterSaleList = new FilterSalesList();
var _Sales = await _FilterSaleList.FindSalesbyFilters();
string _SaleName = _Sales.sales[0].name.ToString();
string _SaleDescription = _Sales.sales[0].description.ToString();
string _SaleName1 = _Sales.sales[1].name.ToString();
string _SaleDescription1 = _Sales.sales[1].description.ToString();
int _TotalResults = _Sales.sales.Length;
SaleTitle.Text = _SaleName;
SaleDescription.Text = _SaleDescription;
SaleTitle1.Text = _SaleName1;
SaleDescription1.Text = _SaleDescription1;

这是列表框的XAML代码,其中已包含2个堆栈面板。

<ListBox Grid.Row="1">
    <StackPanel Margin="0,0,0,5">
        <TextBlock x:Name="SaleTitle" Text="" HorizontalAlignment="Center" Margin="0,0,0,5"/>
        <TextBlock x:Name="SaleDescription" Text="" HorizontalAlignment="Center" MaxHeight="40" Margin="0,0,0,5" TextWrapping="Wrap"/>                        
    </StackPanel>
    <StackPanel Margin="0,0,0,5">
        <TextBlock x:Name="SaleTitle1" Text="" HorizontalAlignment="Center" Margin="0,0,0,5"/>
        <TextBlock x:Name="SaleDescription1" Text="" HorizontalAlignment="Center" MaxHeight="40" Margin="0,0,0,5" TextWrapping="Wrap"/>
    </StackPanel>
</ListBox>

下面是我希望如何看的图片。 即使一切都像我说的那样工作,我希望它能让json中的每个项目都能创建一个新的stackpanel并显示图像中的信息。我不知道这是什么时候这么做,所以即使是一个简单的暗示,哪里看起来会很棒!

http://puu.sh/2biMZ

1 个答案:

答案 0 :(得分:2)

在XAML中有一个非常好的功能叫做Binding,它允许你简单地将一个对象或一个对象列表绑定到visual元素。这样,您就不必在C#代码中手动“构建”图形用户界面。

这是一个非常大的主题,所以你应该看看什么是MVVM,它将帮助你利用绑定的力量:http://channel9.msdn.com/Series/Building-Apps-for-Both-Windows-8-and-Windows-Phone-8-Jump-Start/Building-Apps-for-Both-Windows-8-and-Windows-Phone-8-03-Model-View-ViewModel

但就目前而言,你能做的是:

1 /使用ItemTemplate属性的DataTemplate将ListBox定义如下:

<ListBox Grid.Row="1" x:Name="SalesListbox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="0,0,0,5">
                <TextBlock x:Name="SaleTitle" Text="{Binding name}" HorizontalAlignment="Center" Margin="0,0,0,5"/>
                <TextBlock x:Name="SaleDescription" Text="{Binding description}" HorizontalAlignment="Center" MaxHeight="40" Margin="0,0,0,5" TextWrapping="Wrap"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

DataTemplate将告诉我应该如何呈现列表的每个项目。您还应该注意我们如何在每个文本块中使用Binding作为Text属性。它与namedescription绑定,它们是模型中属性的名称。

然后您可以使用您的数据填充ListBox:

var filterSaleList = new FilterSalesList();
var salesByFilters = await filterSaleList.FindSalesbyFilters();
SalesListbox.ItemsSource = salesByFilters.sales;