【问题标题】:Longlistselector Wp7 binding a list inside a list of objectsLonglistselector Wp7 在对象列表中绑定列表
【发布时间】:2012-05-23 07:23:15
【问题描述】:

您好,我在用于 wp7 的 silverlight 中的数据绑定方面遇到了一些问题。基本上我无法绑定另一个对象列表中的列表。这是我的课程示例。

public class Movie
    {

        public Movie()
        {
            _Venues = new ObservableCollection<Venue>();
        }

        private String _Title;

        public String Title
        {
            get { return _Title; }
            set { _Title = value; }
        }
        private String _Director;

        public String Director
        {
            get { return _Director; }
            set { _Director = value; }
        }
        private String _Runtime;

        public String Runtime
        {
            get { return _Runtime; }
            set { _Runtime = value; }
        }

        private ObservableCollection<Venue> _Venues;

        public ObservableCollection<Venue> Venues
        {
            get { return _Venues; }
            set { _Venues = value; }
        }

public class Venue
    {
        private String _Date;

        public String Date
        {
            get { return _Date; }
            set { _Date = value; }
        }
        private String _Time;

        public String Time
        {
            get { return _Time; }
            set { _Time = value; }
        }
    }
}

我的意图是在 xaml 中设置 Venues 的值:

 <!-- The template for movie items -->
        <DataTemplate x:Key="moviesItemTemplate">
            <StackPanel Grid.Column="1"  VerticalAlignment="Top">
                <StackPanel Grid.Column="1"  VerticalAlignment="Top" Orientation="Horizontal">
                    <Image delay:LowProfileImageLoader.UriSource="{Binding ImageThumb}"/>
                    <TextBlock Text="{Binding Title}" FontSize="26"  Margin="12,-12,12,6" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </StackPanel>
                <ListBox ItemsSource="{Binding Venues}">
                    <TextBlock Text="{Binding Date}" Foreground="Orange"  />
                </ListBox>
            </StackPanel>
        </DataTemplate>

 <!--ContentPanel contains details text. Place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <toolkit:LongListSelector x:Name="moviesListGropus" Background="Transparent" 
                 ItemTemplate="{StaticResource moviesItemTemplate}"
                 GroupHeaderTemplate="{StaticResource groupHeaderTemplate}"
                 GroupItemTemplate="{StaticResource groupItemTemplate}" >   
                <toolkit:LongListSelector.GroupItemsPanel>
                    <ItemsPanelTemplate>
                        <toolkit:WrapPanel/>
                    </ItemsPanelTemplate>
                </toolkit:LongListSelector.GroupItemsPanel>
            </toolkit:LongListSelector>
        </Grid>
    </Grid>

在cs代码中,我使用手动循环来获取movieGroups而不是Linq表达式,但我认为这不应该是这里的问题:

ObservableCollection<Group<Movie>> movieGroups = new ObservableCollection<Group<Movie>>();
this.moviesListGropus.ItemsSource = movieGroups;

public class Group<T> : IEnumerable<T>
        {
            public Group(string name, IEnumerable<T> items)
            {
                this.Title = name;
                this.Items = new List<T>(items);
            }

            public override bool Equals(object obj)
            {
                Group<T> that = obj as Group<T>;

                return (that != null) && (this.Title.Equals(that.Title));
            }

            public string Title
            {
                get;
                set;
            }

            public IList<T> Items
            {
                get;
                set;
            }

            #region IEnumerable<T> Members

            public IEnumerator<T> GetEnumerator()
            {
                return this.Items.GetEnumerator();
            }

            #endregion

            #region IEnumerable Members

            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                return this.Items.GetEnumerator();
            }

            #endregion
        }

遗憾的是,由于 stackoverflows 的限制,我无法提供图片,但结果可以在 http://postimage.org/image/as49vtqvn/ 上看到

编辑第二部分:想法是将另一个 textBlock 放在模板中,该模板将负责从场地列表中显示所需的时间。为此,我需要更深一层,因为场所是一个列表,我想要该列表中的特定对象。有什么建议吗?

 <DataTemplate x:Key="moviesItemTemplate">
            <StackPanel Grid.Column="1"  VerticalAlignment="Top">
                <StackPanel Grid.Column="1"  VerticalAlignment="Top" Orientation="Horizontal">
                    <Image delay:LowProfileImageLoader.UriSource="{Binding ImageThumb}"/>
                    <TextBlock Text="{Binding Title}" FontSize="26"  Margin="12,-12,12,6" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </StackPanel>
                <ItemsControl x:Name="venueTime" ItemsSource="{Binding Path= Venue}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Time}" Foreground="Orange" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>

【问题讨论】:

    标签: windows-phone-7 silverlight-toolkit


    【解决方案1】:

    问题是这样的:

    <ListBox ItemsSource="{Binding Venues}">
        <TextBlock Text="{Binding Date}" Foreground="Orange"  />
    </ListBox>
    

    我怀疑你可能想要的是:

    <ListBox ItemsSource="{Binding Venues}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Date}" Foreground="Orange" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    您在ListBox 中任意使用的TextBlock 被忽略,因为它当时无效。
    如果您不想要默认行为,则需要指定列表框中的项目应如何模板化。默认行为只是带有数据上下文文本的 TextBlock。因为您传递了一个对象(不是文本),所以框架在其上调用 ToString(),默认情况下这会返回对象的类型,这就是您所看到的。

    【讨论】:

    • 非常感谢您的回答。事实上,我的尝试是在预览日期写出特定场地的时间,所以如果你能给我一些建议,比如你看看问题的编辑部分
    • 在 ItemsControl 中显示 VenueTimes。
    • 您能不能详细说明一下,我对 Silverlight 很陌生,到目前为止它还不能正常工作,因为我应该再次用我的新代码更改编辑。
    • 属性名称是Venues,末尾有一个S,而不是你的单数。如果您检查“调试”输出窗口,您将看到一条错误消息,其中包含无效名称的绑定错误。如果您的图像也没有显示,那是因为您绑定到 viewmodel 对象上不存在的属性 (ImageThumb)。
    • 是的,很抱歉,图像还可以,只是不想用代码让人们不知所措,我得到了它的属性。关于场地我添加了 s,现在它向我展示了列表中的所有内容,但我只需要特定场地的时间。这是我得到的图像postimage.org/image/5iqyq9e9p。我想要的是让它在它显示的那天只写一次。例如,每个场地每天都在同一时间,但有三天,当我只需要一个时,它会显示所有场地的时间。
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2016-02-17
    • 2011-07-25
    相关资源
    最近更新 更多