none
关于DataGrid不能及时显示更新的问题 RRS feed

  • 问题

  • DataGrid一直都存在某些属性 例如 行背景、多次修改的值不能及时显示问题,只有拖动 datagrid的滚动条或者刷新才能正确显示,不知道有没有什么解决办法?
    2009年8月27日 2:32

答案

  • 可以,只是每列都要绑定,代价大了点,况且,大部分人都不用DataTemplate,而是AutoGenerateColumns="True",因为DataTemplate还要自己实现点击 Header排序。

    LoadingRow 里面的逻辑可能和我想象的不一样。
    2009年8月31日 8:09
  • 代码收到.  似乎是个Bug,问题出在那个Cache的 testGroups上,如果是新建的就没问题。还有就是初始化的时候 testGroups里的 Group.deleteColor都没有值,都是null,所以在set binding的时候可能出错,如果你在MainPage_Loaded 中,不想让index出现,可以把deleteColor设成Transparent,这样就可以了。
                    Group group = new Group();
                    testGroups.Add(group);
                    group.index = i;
                    group.deleteColor = new SolidColorBrush(Colors.Transparent);
                    groups.Add(group);

    我会再Follow up 为什么是Null的时候会这样。

    谢谢你的代码。

    2009年8月31日 18:29

全部回复

  • DataGrid一直都存在某些属性 例如 行背景、多次修改的值不能及时显示问题,只有拖动 datagrid的滚动条或者刷新才能正确显示,不知道有没有什么解决办法?

    你用Silverlight 2 的DataGrid么?
    如果是到
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=084a1bb2-0078-4009-94ee-e659c6409db0
    下载补丁
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年8月27日 2:37
    版主
  • 确定 Sl 3

    图中 第一列的数字 ,是拖动滚动后才出来的,实际上没有数字的地方应该就有,我猜想是datagrid的更新机制有bug
    • 已编辑 dreamwang 2009年8月27日 3:09
    • 已编辑 李庆_八爪熊Moderator 2009年8月27日 3:36 帮你改贴图改好了:),点击HTML编辑源码用<img scr=""/>
    2009年8月27日 3:06
  • 我觉得可能是RowNumber算法的问题吧,

    public class GroupInfo
    {
    public int RowNumber{get;set;};
    public string GroupName{get;set;};
    .......
    }

    直接把RowNumber绑定上去就应该不会出现你说的这个问题
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年8月27日 3:42
    版主
  • 是直接绑上去的 ,

     public class Group : INotifyPropertyChanged
        {
            private Int32 _index;
            public Int32 index
            {
                get
                {
                    return _index;
                }
                set
                {
                    _index = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("index"));
                    }
                }

            }
            private string _id;
            public string id
            {
                get
                {
                    return _id;
                }
                set
                {
                    _id = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("id"));
                    }
                }

            }

    为了让datagrid接受外部修改,不得不用 INotifyPropertyChanged


    2009年8月27日 4:30
  • 如果是绑定的,不应该出这个问题.
    这个第一列是TemplateColumn吗? 能不能把你的Template贴出来看看?
    2009年8月27日 4:56
  •  <data:DataGrid x:Name="groupsList" AlternatingRowBackground="AntiqueWhite"  BorderBrush="{StaticResource PrimaryBrush}" LoadingRow="groupsList_LoadingRow" AutoGenerateColumns="False"  CanUserSortColumns="True"    RowHeight="25"  Grid.Column="0" Grid.Row="1" Margin="10,5,10,5" >
                <data:DataGrid.Columns>
                    <data:DataGridTemplateColumn >
                          <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid >
                                    <Image Source="images/16.png"  Visibility="{Binding paidIcon}" Width="18"/>
                                    <TextBlock Text="{Binding index}"  HorizontalAlignment="Center" VerticalAlignment="Center" Padding="5,2,5,2" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
                                 </Grid>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
                    <data:DataGridTemplateColumn >
                        <data:DataGridTemplateColumn.HeaderStyle>
                            <Style TargetType="datapri:DataGridColumnHeader">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>   
                                                <TextBlock Text="{Binding gName,Source={StaticResource LocStrings}}" TextAlignment="Center"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </data:DataGridTemplateColumn.HeaderStyle>
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock  Text="{Binding id}" VerticalAlignment="Center" Padding="5,2,5,2" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
                    <data:DataGridTemplateColumn >
                        <data:DataGridTemplateColumn.HeaderStyle>
                            <Style TargetType="datapri:DataGridColumnHeader">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding cUsr,Source={StaticResource LocStrings}}"   VerticalAlignment="Center" Padding="5,2,5,2"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </data:DataGridTemplateColumn.HeaderStyle>
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock   Text="{Binding users}" VerticalAlignment="Center" Padding="5,2,5,2"  MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
                    <data:DataGridTemplateColumn >
                        <data:DataGridTemplateColumn.HeaderStyle>
                            <Style TargetType="datapri:DataGridColumnHeader">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding contact,Source={StaticResource LocStrings}}" TextAlignment="Center"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </data:DataGridTemplateColumn.HeaderStyle>
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock  Text="{Binding contact}" VerticalAlignment="Center" Padding="5,2,5,2"  MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>     
    2009年8月27日 5:00
  • 如果是 绑定 控件的背景属性 的话,这类需要 滚动滚动条(或其他能够触发datagrid布局刷新的动作)才能更新的情况 很容易出现
    2009年8月27日 5:06
  • 你的index 跟contact都用的同样的方式绑定进去的,没道理index要拖动Scorll才刷新,contact就即时显示

    是说,由于再一个Cell里再绑定这个<Image Source="images/16.png"  Visibility="{Binding paidIcon}" Width="18"/>造成的是么?

    但是这个也不是绑定控件背景,是同时又绑定上了一张图片,如果去掉Visibility="{Binding paidIcon}"你的DataGrid显示是否还有问题?
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年8月27日 5:28
    版主
  • contact基本上是个死的,也就是赋值后就没有变化过,而 index是在绑定的时候可能是null,值后来进行变化了。 这里的index只是一个很简单的代表,跟行、列都无关。 
    但是不管我什么时候赋值或修改值,都不应该滚动前没有,滚动后出现,不然 INotifyPropertyChanged 还有什么作用?

    关于 背景  的示例 这个表里 没有,就是因为不能更新的原因,放弃了使用任何背景的动态修改,改用文字的颜色 去区分 给类性质的组。
    2009年8月27日 5:38
  • 不好意思,还是没法能重现你的问题。

    要是index可能为null,就要声明
     public int? index

    直接public int index的index不可能为null

    2009年8月27日 6:56
    版主
  • 是,  我只想说和 int 没有关系
    2009年8月27日 6:58
  • em...做了个简单的,似乎work啊.
    你在  LoadingRow="groupsList 这个event handler里做了哪些事情?
    能不能给我发一个简单的repro过来?谢谢. (xun.sun@microsoft.com)

    2009年8月27日 17:21
  • 终于可以复现了。


            private void groupsList_LoadingRow(object sender, DataGridRowEventArgs e)
            {
                e.Row.SetBinding(DataGridRow.ForegroundProperty, new System.Windows.Data.Binding("deleteColor"));
            }

    在初始化时 没有给 deleteColor 属性赋值,结果 index 不可现。

    后来给deletecolor附上值,结果就是 必须拖动滚动条才能 显示出来。  可能背景属性更明显。


    2009年8月31日 3:49
  • 终于可以复现了。


            private void groupsList_LoadingRow(object sender, DataGridRowEventArgs e)
            {
                e.Row.SetBinding(DataGridRow.ForegroundProperty, new System.Windows.Data.Binding("deleteColor"));
            }

    在初始化时 没有给 deleteColor 属性赋值,结果 index 不可现。

    后来给deletecolor附上值,结果就是 必须拖动滚动条才能 显示出来。  可能背景属性更明显。



    所以每次LoadingRow的时候才会更新,不可以直接绑定在DataTemplate里嘛?
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年8月31日 7:32
    版主
  • 可以,只是每列都要绑定,代价大了点,况且,大部分人都不用DataTemplate,而是AutoGenerateColumns="True",因为DataTemplate还要自己实现点击 Header排序。

    LoadingRow 里面的逻辑可能和我想象的不一样。
    2009年8月31日 8:09
  • 建议还是直接DataTemplate里做绑定 
    可以降低UI跟Code耦合度
    如果以后要修改的话,不用再修改后台的code了 


    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年8月31日 8:34
    版主
  • 代码收到.  似乎是个Bug,问题出在那个Cache的 testGroups上,如果是新建的就没问题。还有就是初始化的时候 testGroups里的 Group.deleteColor都没有值,都是null,所以在set binding的时候可能出错,如果你在MainPage_Loaded 中,不想让index出现,可以把deleteColor设成Transparent,这样就可以了。
                    Group group = new Group();
                    testGroups.Add(group);
                    group.index = i;
                    group.deleteColor = new SolidColorBrush(Colors.Transparent);
                    groups.Add(group);

    我会再Follow up 为什么是Null的时候会这样。

    谢谢你的代码。

    2009年8月31日 18:29