我正在开发一个Windows Phone应用程序,以在控件LongListSelector中练习我的知识。应用程序中的一个页面,中间的页面包含以下代码:
<!--Panorama item two-->
<phone:PanoramaItem x:Name="tasksPage" Header="Tasks">
<!--Double line list with image placeholder and text wrapping using a floating header that scrolls with the content-->
<phone:LongListSelector Margin="0,-38,-22,2" ItemsSource="{Binding Items}" LayoutMode="List">
<phone:LongListSelector.ListHeaderTemplate>
<DataTemplate>
<Grid Margin="12,0,0,38">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="second item"
Style="{StaticResource PanoramaItemHeaderTextStyle}"
Grid.Row="0"/>
</Grid>
</DataTemplate>
</phone:LongListSelector.ListHeaderTemplate>
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="12,2,0,4" Height="105" Width="432">
<!--Replace rectangle with image-->
<Border BorderThickness="1" Width="99" Height="99" BorderBrush="#FFFFC700" Background="#FFFFC700"/>
<StackPanel Width="311" Margin="8,-7,0,0">
<TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Margin="10,0" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeLarge}" />
<TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" />
</StackPanel>
</StackPanel>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
</phone:PanoramaItem>
有人可以简要解释一下DataBindings是什么以及如何使用它们(我做了一些研究)。我可以将LongListSelector绑定到IsolatedStorage中的列表吗?
我之前在另一个应用程序中创建了一个ListBox,将IsolatedStorage中的内容加载到其中,但我不知道这是否是正确的方法。现在LongListSelector中的项目左边有一个黄色图像 - 如果我从IsolatedStorage以编程方式加载内容,我可以这样做吗?
我知道这可能是一两个问题,但我认为对于有经验的人来说,回答起来相当简单。
谢谢!
答案 0 :(得分:0)
最简单的解释(过度简化!)是数据绑定将对象的属性绑定到上面控件的另一个属性,有:
<TextBlock Text="{Binding LineOne}" ... />
这在功能上等同于:
TextBlock t = new TextBlock();
SomeObject o = new SomeObject() { LineOne = "The value of line 1" };
t.Text = o.LineOne;
// and then a propertychange listener to update t.text if o.lineone ever changes
o.PropertyChanged += (s,e) => { if (e.PropertyName == 'LineOne') t.Text = o.LineOne; };
您无法将直接绑定到隔离存储中的某些内容,但您可以让对象从隔离存储加载其内容,通过Items
属性公开这些项,然后将其设置为作为LLS的数据上下文。
在LongListSelector
(或其他ItemsControl
类型)的情况下,itemscontrol的ItemsSource
属性绑定到某些对象集合(如ObservableCollection<T>
,这会使其项目更新每当集合更新。然后ItemsControl
内的模板绑定到集合中各个项的属性。
答案 1 :(得分:0)
您的LongListSelector
内有多个项目。通过将ItemsSource
绑定到Items
集合的一部分的项目,将数据绑定添加到那里。此集合可以是List<T>
或更频繁ObservableCollection<T>
,因为如果正确实施,ObservableCollection
中的更改将反映在您的LongListSelector
中。 T
是您商品的类型 - 例如,名为Book
的类。此集合需要定义为DataContext对象的一部分,您可以在整个页面或页面的一部分上设置该对象。
现在,正如我所提到的,Items
集合可能充满了项目 - 定义为具有某些属性的对象。在您的情况下,这些属性是LineOne
和LineTwo
,可能是字符串。
您无法直接绑定到独立存储中的项目。首先需要将这些项加载到内存中。假设您有一个在隔离存储中序列化为JSON或XML格式的项目列表,这是将列表保留在独立存储中的一种常用方法。您需要将它们加载到集合中(反序列化),然后绑定到LongListSelector
。这是正确的方法,是的。
左边定义的黄色图像/矩形/边框是静态的,但当然可以在那里。它只是作为LongListSelector
中每个项目的一部分呈现在那里,它不依赖于你绑定的对象。
我建议你阅读以下文章/问题和答案,这些文章可以解释绑定到列表的概念更容易让你理解: