【问题标题】:How to fast update items in DataGrid (WPF .NET4)如何快速更新 DataGrid (WPF .NET4) 中的项目
【发布时间】:2012-02-13 10:13:06
【问题描述】:

我对 WPF .NET 4 中的 DataGrid 有疑问。

这是带有 DataGrid 的 XAML 代码:

    <DataGrid Name="m_DataGrid">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Name}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="True" >
                                <Setter Property="Background" Value="Gray" />
                                <Setter Property="Foreground" Value="White" />
                                <Setter Property="BorderBrush" Value="Gray" />
                            </Trigger>
                            <DataTrigger Binding="{Binding Path=IsRed}" Value="True">
                                <Setter Property="Foreground" Value="Red" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

并且窗口代码中有方法:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            m_DataGrid.Items.Add(new MyItem(string.Format("Item {0}", i)));
        }
    }

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Space)
        {
            e.Handled = true;
            ((MyItem)m_DataGrid.SelectedItem).IsRed = !((MyItem)m_DataGrid.SelectedItem).IsRed;
            m_DataGrid.SelectedIndex++;
            m_DataGrid.Items.Refresh();
        }
    }

这里是 MyItem 类代码:

public class MyItem
{
    public string Name { get; set; }
    public bool IsRed { get; set; }

    public MyItem(string _Name)
    {
        Name = _Name;
        IsRed = false;
    }
}

问题是,我必须使用方法 m_DataGrid.Items.Refresh();以红色显示项目。但是当我有例如。 100项这个方法太慢了。因此,当我按住空格键时,项目会非常缓慢地用红色标记。如何以更好、更优雅的方式做到这一点?如何在没有刷新方法的情况下更改项目颜色? 感谢您的回答和提示。

【问题讨论】:

    标签: wpf datagrid refresh


    【解决方案1】:

    你为什么要刷新整个列表?使用适当的数据绑定支持数据源,并且只有那些更改的项目需要更新 - WPF 会自动对您完全透明地处理。

    然后你可以在模板位图中缓存输出,你就安全了。

    如果我没看错的话,Items.Refresh 会刷新整个网格 - 肯定会很慢。

    【讨论】:

      【解决方案2】:

      您的类 MyItem 应该继承自 INotifyPropertyChanged,并且 IsRed 属性声明为...

      private bool _isRed;
      public bool IsRed
      {
          [DebuggerStepThrough]
          get { return _isRed; }
          [DebuggerStepThrough]
          set
          {
              if (value != _isRed)
              {
                  _isRed = value;
                  OnPropertyChanged("IsRed");
              }
          }
      }
      

      使用此方案,当您的代码将 IsRed 更改为 true 时,将通知订阅者并且您的网格将进行适当的更新。这将达到您正在寻找的结果。

      DataGrid 的“刷新”方法不适合更改属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        相关资源
        最近更新 更多