我即将开始为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中实现这一目标?这甚至是这样做的方式吗?
答案 0 :(得分:1)
一个属性只能有一个绑定,以达到类似
的目的<TextBlock Text="{Binding TotalAmount} ({Binding Things.Count})" />
您可以使用两个文本块,也可以使用Runs和StringFormat
<TextBlock>
<Run Text="{Binding TotalAmount}"/>
<Run Text="{Binding Things.Count, StringFormat='{}({0})'}"/>
</TextBlock>