Как быстро обновить элементы в DataGrid (WPF .NET4) - PullRequest
1 голос
/ 18 января 2012

У меня есть вопрос о DataGrid в WPF .NET 4.

Вот код XAML с DataGrid:

    <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 пунктов этот метод слишком медленный. Поэтому, когда я удерживаю пробел, элементы отмечаются красным цветом очень медленно. Как сделать это лучше и элегантнее? Как изменить цвет элемента без обновления? Спасибо за ваши ответы и советы.

Ответы [ 2 ]

1 голос
/ 18 января 2012

Ваш класс, 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 не подходит для изменений свойства.

0 голосов
/ 18 января 2012

Какого черта ты обновляешь весь список?Используйте надлежащий источник данных, поддерживающий привязку данных, и только те элементы, которые изменяются, требуют обновлений - и WPF обрабатывает это полностью прозрачно для вас автоматически.

Затем вы можете в кэше растрового изображения шаблона вывести данные и вы в безопасности.

Items.Refresh обновляет всю сетку, если я правильно прочитал - конечно, это медленно.

...