none
ListView无法显示绑定数据。。。汗。。 RRS feed

  • 问题

  • 接触Win8 Metro开发前,只进行过传统Win32程序开发,发现和以前传统开发完全不同了,好像是属于WPF的范畴。

     

    因未接触过WPF,对控件模板、数据绑定毫无概念。经过网上大量查找,对数据绑定有点感觉了,可对:如何将绑定好的数据显示出来,却一筹莫展。。。

     

    我根据理解,写了如下代码,执行正常,但是不显示。。

    c#

            private ObservableCollection<Item> Items = new ObservableCollection<Item>();

            public class Item
            {
                public string Name { get; set; }
                public string Age { get; set; }
            }

            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                string[] info;

                info = S.ToString().Split('|');

                for (int i = 0; i < info.Length / 2; i++)
                {
                    Items.Add(new Item() { Name = info[i * 2], Age = info[i * 2 + 1]});
                }

                ListView1.DataContext = Items;
            }

     XAML

            <ListView x:Name="ListView1" HorizontalAlignment="Left" Height="564" Margin="404,0,0,0" Grid.Row="1" VerticalAlignment="Top" Width="908" Background="#FFDCC5C5" ItemsSource="{Binding Items}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid Height="Auto" Margin="0" VerticalAlignment="Top">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="3*"/>
                                <ColumnDefinition Width="7*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text ="{Binding Name}" FontSize="20" VerticalAlignment="Top" HorizontalAlignment="Left" TextWrapping="Wrap"/>
                            <TextBlock Text ="{Binding Age}" FontSize="20" VerticalAlignment="Top" HorizontalAlignment="Left" TextWrapping="Wrap"/>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

     请教Bob Bao:

    1、上面代码为何不能显示?我的需求是把一个2维数组,放入ListView中,2列显示,每列第一行现实标题Name、Age

    2、我网上找了很多资料,但是感觉没有对我有帮助,能否推荐一个入门的资料,帮我快速了解ListView绑定数据的显示原理、绑定方法?

    盼复,谢谢!!

    我参考了您之前回复的问题:

    http://social.msdn.microsoft.com/Forums/en/metroappzhcn/thread/2afcd848-5055-43ce-9dd1-2db4a75d0be9

    2012年8月21日 4:11

答案

  •  class Tempelet
            {
                public Tempelet(string send, string theme, string time)
                {
                    Send = send;
                    Theme = theme;
                    Time = time;
                }
                public string Send
                {
                    get;
                    set;
                }

                public string Theme
                {
                    get;
                    set;
                }

                public string Time
                {
                    get;
                    set;
                }
            }

            List<Tempelet> tem = new List<Tempelet>
            {
                new Tempelet("XiaoLai","你的邮件到了,记得去取哦!","8:17"),
                new Tempelet("Metro","Metro应用风格,全新体验!","8:17"),
                new Tempelet("Windows 8","Windows 8 火热上市了!","8:17")
            };

       lvMail.ItemsSource = tem;

    我这样就可以成功显示出来了,你参考参考吧!

    • 已标记为答案 学习WIN8 2012年8月21日 9:29
    2012年8月21日 8:19

全部回复

  • 我绑定数据一直是放在listView1.itemsSource,从未出现在这种问题。你试试看?

    2012年8月21日 6:50
  • 我绑定数据一直是放在listView1.itemsSource,从未出现在这种问题。你试试看?


    请问我该如何做呢?因为一直不了解原理,所以对于如何做很困惑,尤其是XAML部分
    2012年8月21日 7:13
  • 我绑定数据一直是放在listView1.itemsSource,从未出现在这种问题。你试试看?


    请问数据如何放在ItemsSource呢?谢谢
    2012年8月21日 7:34
  • ListView1.itemsSource = Items;

    这样就行啦!其实就是items里面每一项的Name和Age到界面绑定名字{Bing Name}和{Bing Age}的映射!个人是这样理解的!

    2012年8月21日 8:16
  •  class Tempelet
            {
                public Tempelet(string send, string theme, string time)
                {
                    Send = send;
                    Theme = theme;
                    Time = time;
                }
                public string Send
                {
                    get;
                    set;
                }

                public string Theme
                {
                    get;
                    set;
                }

                public string Time
                {
                    get;
                    set;
                }
            }

            List<Tempelet> tem = new List<Tempelet>
            {
                new Tempelet("XiaoLai","你的邮件到了,记得去取哦!","8:17"),
                new Tempelet("Metro","Metro应用风格,全新体验!","8:17"),
                new Tempelet("Windows 8","Windows 8 火热上市了!","8:17")
            };

       lvMail.ItemsSource = tem;

    我这样就可以成功显示出来了,你参考参考吧!

    • 已标记为答案 学习WIN8 2012年8月21日 9:29
    2012年8月21日 8:19
  • 感谢!测试了一下,没问题。

    2012年8月21日 8:23
  • Hi,

    的确这样,我学习WPF时,绑定当时也是困惑我很长时间,最主要原因是XAML代码是不能调试的。

    你代码的问题是ListView中用来显示数据的用的是ItemsSource属性,而你把DataContext属性设置之后,实际上ListView对DataContext不做处理。ItemsSource用来对“显示集合“控件提供数据源。而DataContext实际上是用来提供绑定的。所以你那里不会显示数据。

    个人感觉DataContext一般放在布局中用来对包含的显示控件提供绑定,而因为DataContext本身可以继承,因此很多时候会被设置在Page上,比如MVVM中就是用属性驱动的,把数据源直接设置在page的DataContext中。而ItemsSource只用在显示集合控件(比如ListView,GridView),而且ItemsSource只能设置集合,而ListView等将其中内容一条条显示出来。

    你可以看看这个StackOverFlow的解释,写的比较易懂:

    http://stackoverflow.com/questions/3169245/difference-between-itemssource-and-datacontext-as-pertains-to-listbox

    Hope this helps


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月22日 7:06
    版主