none
这个DataGrid为什么在数据绑定之后,只显示出来一行数据? RRS feed

  • 问题

  • <data:DataGrid Height="103" Margin="29,0,31,65" VerticalAlignment="Bottom" TabIndex="20" x:Name="dgPrmItems" SelectionMode="Extended" AutoGenerateColumns="False" GridLinesVisibility="All" TabNavigation="Cycle" IsReadOnly="True" RowHeight="0">
    
                <data:DataGrid.Background>
    
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
    
                        <GradientStop Color="#FF5399FF" Offset="0"/>
    
                        <GradientStop Color="#FF6F84B3" Offset="1"/>
    
                        <GradientStop Color="#FFE9F6FF" Offset="0.254"/>
    
                        <GradientStop Color="#FFE7F4FF" Offset="0.95099997520446777"/>
    
                        <GradientStop Color="#FF87B7FD" Offset="0.13400000333786011"/>
    
                    </LinearGradientBrush>
    
                </data:DataGrid.Background>
    
                <data:DataGrid.AlternatingRowBackground>
    
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
    
                        <GradientStop Color="#FF000000"/>
    
                        <GradientStop Color="#FFFFFFFF" Offset="1"/>
    
                    </LinearGradientBrush>
    
                </data:DataGrid.AlternatingRowBackground>
    
                <data:DataGrid.Columns>
    
                    <data:DataGridTextColumn Header="唯一编号" CanUserSort="True" CanUserResize="True" Binding="{Binding id}" Visibility="Collapsed"/>
    
                    <data:DataGridTextColumn Header="产品类别" CanUserSort="True" CanUserResize="True" Binding="{Binding producttypedes}"/>
    
                    .... ...
    
                </data:DataGrid.Columns>
    
            </data:DataGrid>
    
    
    
    
    下面数据绑定代码:

                PrmItem pi = new PrmItem()
    
                {
    
                    id = Guid.NewGuid().ToString(),
    
                    producttypedes = sc.ProductTypeDes,
    
                   ... ...
    
                };
    
                this.lstPrmItems.Add(pi);<br/><br/>            // 在page.xaml.cs类里,有一个private List<PrmItem> lstPrmItems = new List<PrmItem>();<br/>
    
                this.dgPrmItems.ItemsSource = this.lstPrmItems;
    
    
    
    还有这个类的定义:
        public class PrmItem
    
        {
    
            public string id {get;set;}
    
            public string producttypedes { get; set; }
    
            ... ...
    
        }
    
    
    这个数据绑定的动作是由一个按钮的click触发的。但数据绑定之后,在界面上只能显示出来第一行的数据,而实际上那个list里的数据都已经加入了,元素数随着按钮的按下而增加。 

    这几段程序有什么问题吗?
    HAL
    2009年4月9日 9:05

答案

  • 和绑定无关。你的ItemsSource需要Implement INotifyCollectionChanged 。这样你新加入的数据才会立刻显示出来。试试这个:
    ObservableCollection<object> observableCollection = new ObservableCollection<object>();
    
    IEnumerator enumerator = lstPrmItems.GetEnumerator();
    
    enumerator.Reset();
    
    while (enumerator.MoveNext())
    
            observableCollection.Add(enumerator.Current);
    
    
    
    this.dgPrmItems.ItemsSource = observableCollection;
    
    
    
    
    
    

    加入数据的时候直接 加到observableCollection里。

    SL3 里的PagedCollectionView 是个更好的选择,因为它支持Paging, Sorting, Grouping.
    PagedCollectionView view = new PagedCollectionView(lstPrmItems);

    2009年4月10日 18:20

全部回复

  • 你用VS2008 DEBUG一下看看LIST里有几条数据就知道了


    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com

    2009年4月10日 3:52
    版主
  • 看过,元素数每点一次按钮增加一个。我在贴子里有说明白的。


    HAL
    2009年4月10日 4:35
  • 明白了。itemsource只有在有change时才会重新绑定数据。

                this.lstPrmItems.Add(pi);
               
                this.dgPrmItems.ItemsSource = null;
                this.dgPrmItems.ItemsSource = this.lstPrmItems;

    我每次都先设null, 再绑定,就正常了。
    不过我觉得这个解决方案不对。有没有人知道正确的处理方式是什么?

    我记得有个oneway, twoway什么的。
    HAL
    2009年4月10日 4:47
  • 和绑定无关。你的ItemsSource需要Implement INotifyCollectionChanged 。这样你新加入的数据才会立刻显示出来。试试这个:
    ObservableCollection<object> observableCollection = new ObservableCollection<object>();
    
    IEnumerator enumerator = lstPrmItems.GetEnumerator();
    
    enumerator.Reset();
    
    while (enumerator.MoveNext())
    
            observableCollection.Add(enumerator.Current);
    
    
    
    this.dgPrmItems.ItemsSource = observableCollection;
    
    
    
    
    
    

    加入数据的时候直接 加到observableCollection里。

    SL3 里的PagedCollectionView 是个更好的选择,因为它支持Paging, Sorting, Grouping.
    PagedCollectionView view = new PagedCollectionView(lstPrmItems);

    2009年4月10日 18:20
  • 没错,这就是我要找的东西。
    现在的代码如下:

     

        public partial class Page : UserControl

        {
            // 数据集合。做为类成员存在。

       private ObservableCollection<PrmItem> ocPrmItems =

    new ObservableCollection<PrmItem>();

     

            public Page()

            {

                InitializeComponent();

                //一次性指定数据源。
               
    this.dgPrmItems.ItemsSource = this.ocPrmItems;

            }

     

     

       private void btAddPrmItem_Click(object sender, RoutedEventArgs e)

            {

              

                PrmItem pi = new PrmItem()

                {

                    producttype = sc.ProductType,
                    ... 
               
    };

                this.ocPrmItems.Add(pi);

               

                this.dgPrmItems.ScrollIntoView(pi, dgPrmItems.Columns[0]);

               

            }

        }


    HAL
    2009年4月13日 4:17