WP8 App没有Bindings吗?

时间:2013-08-11 14:41:31

标签: xaml windows-phone-8 windows-runtime winrt-xaml

我即将开始为Windows Phone 8开发应用程序并完成第一步(我已经拥有一些带WinForms的C#背景)。但我意识到一切,尤其是XAML,似乎都很复杂。即使是填充列表这样的最简单的事情, * 也是如此痛苦。它确实适用于平坦且极其简单的绑定(如大多数教程中所提出的),但这只是僵硬且不灵活。

我想生成一个列表(LongListSelector),其中包含包含这些信息的项目(“o”表示每个项目):

<o.Name>
<o.TotalAmount> (<o.Things.Count>)
[if o.MiscThings.Count > 0]<o.MiscThings.Count> other thing(s)[/if]

数据示例:

John Doe
22.97 (3)
2 other thing(s)

Jane Doe
7.55 (1)

我试图通过以下方式实现这一目标:

<phone:LongListSelector x:Name="LLS_Summary">
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
                <TextBlock Text="{Binding Name}" Style="{StaticResource PhoneTextLargeStyle}" />
                <TextBlock Text="{Binding TotalAmount} ({Binding Things.Count})" /> <!-- throws an error, concatenation doesn't work? -->
                <!-- well yeah this is obviously not possible with data binding -->
            </StackPanel>
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>

// in .cs
LLS_Summary.ItemsSource = App.MyItems; // IList

甚至没有关闭。如果我事先有某种转换器并且有条件的东西不能以这种方式工作,那么连接似乎才有效。

所以我的方法是自己在运行时生成元素。但是怎么样? LongListSelector控件似乎根本不支持这一点。在WinForms中,我会做类似的事情:

Label line1 = new Label();
line1.Text = o.Name;
Label line2 = new Label();
line2.Text = o.TotalAmount + " (" + o.Things.Count + ")";
Label line3 = new Label();
if (o.MiscThings.Count > 0)
    line3.Text = o.MiscThings.Count + " other thing(s)";
else
    line3.Text = "";

// sizing, positioning etc.

Panel panel = new Panel();
panel.Controls.Add(line1);
panel.Controls.Add(line2);
panel.Controls.Add(line3);

LLS_Summary.Controls.Add(panel);

如何在Win(P)RT中实现这一目标?这甚至是这样做的方式吗?

1 个答案:

答案 0 :(得分:1)

一个属性只能有一个绑定,以达到类似

的目的
<TextBlock Text="{Binding TotalAmount} ({Binding Things.Count})" />

您可以使用两个文本块,也可以使用Runs和StringFormat

<TextBlock>
     <Run Text="{Binding TotalAmount}"/>
     <Run Text="{Binding Things.Count, StringFormat='{}({0})'}"/>
</TextBlock>