Сортировка / обновление DataGrid - PullRequest
0 голосов
/ 13 марта 2012

Мое приложение во время его запуска заполняет DataGrid данными, полученными из базы данных. Мои поля: имя, идентификатор и статус. Первые два не проблема, но третий (Status) - это int, либо 1, либо 0, что означает активный или неактивный.

Я решил создать пользовательский элемент управления для отображения поля «Статус». Это не что иное, как круг, который становится зеленым или красным в зависимости от значения «Статус». Цвет элемента управления по умолчанию - красный.

Я также создал объект списка («данные»), который содержит мою информацию плюс элемент управления с соответствующим цветом. Пока проблем нет. Все работает, и если я сделаю быстрый просмотр своего объекта данных, все будет так, как должно быть.

Моя проблема заключается в том, что после того, как я заполнил DataGrid "myDataGrid.ItemsSource = data", каждый элемент управления "Status" отображается красным, когда некоторые из них должны быть зелеными. Если я в любой момент остановлюсь и быстро посмотрю свой объект «данных», все в порядке, но DataGrid не обновляется. То же самое происходит для сортировки. Если я изменю цвет любого из элементов управления, после сортировки любого из столбцов он сбрасывает цвет всех моих пользовательских элементов управления по умолчанию (красный).

После нескольких тестов и исследований я думаю, что проблема в том, что DataGrid обновляется в конце источника элемента и создает новые пользовательские элементы управления вместо использования элементов управления в моем объекте данных.

Есть ли способ решить это? Я перепробовал несколько решений, которые нашел в Интернете, и пока ничего не получалось!

1 Ответ

1 голос
/ 13 марта 2012

Предположим, ваш класс выглядит примерно так ...

 public class MyObject
 {
     public string Name { get; set; }
     public int ID { get; set; }
     public int Status { get; set; }
     public UserControl StatusControl { get; }
 }

Верны ли мои предположения?

Если так, у меня есть несколько рекомендаций

  1. Реализовать INotifyPropertyChanged событие и поднять свойства для привязанных уведомлений свойств для свойств Name, ID и Status.
  2. Избавьтесь от своего свойства UserControl type (т.е. StatusControl) от вашей модели (т.е. MyObject class)
  3. Не используйте AutogenerateColumns как true (по умолчанию true) для сетки данных. Создайте свои конкретные столбцы ...

     <tk:DataGrid x:Name="MyDataGrid"
                  ItemsSource="{Binding MyObjects}"
                  AutoGenerateColumns="False">
          <tk:DataGrid.Columns>
              <tk:DataGridTextColumn Header="ID"
                                     Binding="{Binding ID}" />
              <tk:DataGridTextColumn Header="Name"
                                     Binding="{Binding Name}" />
              <tk:DataGridTemplateColumn Header="Status"
                                         SortMemberPath="Status">
                  <tk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ns:StatusControl>
                            <ns:StatusControl.Style>
                                <Style TargetType="{x:Type ns:StatusControl}">
                                    <Setter Property="IndicatorColor"
                                            Value="Green"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Status}"
                                                     Value="1">
                                            <Setter Property="IndicatorColor"
                                                    Value="Red"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>                                           
                            </myNamespace:StatusControl.Style>
                        </myNamespace:StatusControl>
                    </DataTemplate>
                </tk:DataGridTemplateColumn.CellTemplate>
            </tk:DataGridTemplateColumn>
        </tk:DataGrid.Columns>
     <tk:DataGrid>
    

Здесь ваш пользовательский элемент управления (например, StatusControl) должен предоставлять свойство Brush (что-то вроде IndicatorColor), чтобы в зависимости от состояния, цвет Fill круга в пользовательском элементе управления (см. DataTrigger) изменится.

Таким образом, при получении обновлений для Status свойства MyObject DataTrigger обновит цвет в пользовательском элементе управления.

Надеюсь, это поможет ...

...