未分组的长列表选择器

时间:2013-06-13 19:42:25

标签: c# xaml listview windows-phone-8 longlistselector

好的,我正在尝试将带有 DisplayName 属性的对象列表绑定到长列表选择器。

XAML代码

<phone:LongListSelector x:Name="lls_TemplateFields" HorizontalAlignment="Left" Width="450" Grid.Row="2" Height="400" LayoutMode="List" Background="#FF9E9D9D" IsGroupingEnabled="False">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding DisplayName}" Foreground="Black" FontSize="24"/>
                    </Grid>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
 </phone:LongListSelector>

C#代码

List<AttributeDefinition> m_SelectedAttributes = new List<AttributeDefinition>();
lls_TemplateFields.ItemsSource = m_SelectedAttributes;

我的班级属性定义包含 DisplayName 的属性。如果我使用组密钥对列表进行分组,则列表将显示,但是我不能只显示要显示的项目的简单列表。就像WPF C#中的列表框一样。

我使用此列表来表示从另一个列表中选择的AttributeDefinitions的列表,该列表显示按其DisplayName属性按字母顺序分组的所有AttributeDefinitions,并且Display Value被绑定到DisplayName属性,如下所示......

XAML

<phone:LongListSelector x:Name="lls_AttributeList" HorizontalAlignment="Left" Height="450" VerticalAlignment="Top" Width="450" HideEmptyGroups="True" IsGroupingEnabled="True" SelectionChanged="SelectionChanged">
         <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                      <Grid>
                            <Border BorderThickness="2">
                                <TextBlock Text="{Binding DisplayName}" Foreground="{StaticResource PhoneChromeBrush}" FontSize="24"/>
                            </Border>
                      </Grid>
                </DataTemplate>
        </phone:LongListSelector.ItemTemplate>
        <phone:LongListSelector.GroupHeaderTemplate>
                <DataTemplate>
                      <Grid Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Center" Background="Blue">
                            <Border BorderThickness="4">
                                <TextBlock Text="{Binding Key}" Foreground="White" FontSize="38" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </Border>
                      </Grid>
                </DataTemplate>
        </phone:LongListSelector.GroupHeaderTemplate>
</phone:LongListSelector>

C#

List<AttributeKeyGroup<AttributeDefinition>> DataSource = AttributeKeyGroup<AttributeDefinition>.CreateGroups(AttributeData,
                                                                                                        Thread.CurrentThread.CurrentUICulture,
                                                                                                        (AttributeDefinition aDef) => { return aDef.Type; },
                                                                                                        true);

lls_AttributeList.ItemsSource = DataSource;

这个列表很好用。并且后台中的数据运行正常,因为当我从 attributedefinitions 的总列表中选择项目时,它们将从 LongListSelector 中删除并添加到 LongListSelector < / strong>所选列表 Itemssource

有关此用户控制的更多代码的进一步查询,请随时问我将尽可能多地披露代码,而不会违反我的工作保密协议。感谢您抽出宝贵时间阅读并提供帮助。非常感谢。

2 个答案:

答案 0 :(得分:0)

List<AttributeDefinition> m_SelectedAttributes = new List<AttributeDefinition>();
lls_TemplateFields.ItemsSource = m_SelectedAttributes;

因为你刚刚实例化了这个列表并立即绑定它?如何将一些项目添加到列表中

答案 1 :(得分:0)

这有两个答案。我试过两个都工作。

[1]如果列表包含1个或更多项,则必须在更新数据时将LongListSelector.ScrollTo(object)设置为列表的第一个对象。比如...

lls_TemplateFields.ItemsSource = m_SelectedAttributes;

if(m_SelectedAttributes.Count > 0)
{
     lls_TemplateFields.ScrollTo(m_SelectedAttributes[0]);
}

[2]解决这个问题的正确方法是使用ObservableCollections,它可以更好地与DataBinding和WP8 WPF SDK UI一起使用,以便在将对象添加到ObservableCollection时进行更新。

ObservableCollection<AttributeDefinition> m_SelectedAttributes =
               new  ObservableCollection<AttributeDefinition>();


lls_TemplateFields.ItemsSource = m_SelectedAttributes