3

我有一个适用于 Windows 8 的应用程序,它需要获取一个 Json 字符串并将其反序列化为 DATACONTRACTS,它将在具有最大高度的列表框中显示我希望的信息,如果大于最大高度,它将滚动。

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

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

这是我的代码,它使用辅助类从 json 中获取项目并将它们放入 TextBlocks 的文本中。

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 中的每个项目都会创建一个新的堆栈面板并显示图像中的信息。我不知道这样做的时候它叫什么,所以即使是一个关于在哪里看的简单提示也会很棒!

http://puu.sh/2biMZ

4

1 回答 1

2

在 XAML 中有一个非常好的特性,称为绑定,它允许您简单地将对象或对象列表绑定到可视元素。这样,您不必在 C# 代码中手动“构建”图形用户界面。

这是一个非常大的话题,所以您可能应该看看什么是 MVVM,它将帮助您利用 Binding 的强大功能: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 将告诉列表中的每个项目应如何呈现。您还应该注意到我们如何为每个文本块中的文本属性使用绑定。name它与description模型中的属性名称绑定在一起。

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

var filterSaleList = new FilterSalesList();
var salesByFilters = await filterSaleList.FindSalesbyFilters();
SalesListbox.ItemsSource = salesByFilters.sales;
于 2013-03-03T14:43:58.273 回答