2011-02-01 2 views
2

У меня есть DataGrid с ItemsSource определен следующим образом:Как стилизации WPF DataGridCell динамически

dg.ItemsSource = new ObservableCollection<myRow> 

...

public class myRow : Collection<myDataGridCell> { ... } 

...

public interface ImyDataGridCell 
{ 
    Brush Background { get; set; } 
    Brush Foreground { get; set; } 
} 

, а затем У меня есть классы для каждого типа столбцов/ячеек:

public class myTextBoxColumn : DataGridTextColumn {...} 
public class myTextBoxCell : TextBox, ImyDataGridCell {...} 

затем я установил CellStyle каждого столбца, как это:

в конструктор каждого столбца:

string source = String.Format(CultureInfo.InvariantCulture, "[{0}].", dataGrid.Columns.Count); 
// I set the "source" string to the column's index in the dataGrid's Columns list between [] to get an index in my binding below. 

CellStyle = new Style(typeof(DataGridCell)); 
CellStyle.Setters.Add(new Setter(DataGridCell.BackgroundProperty, new Binding(source + "Background"))); 

это позволяет мне связать свойство фона фактической DataGridCell к фоновому свойству представления моей клетки, и, таким образом, для изменения фона ячейки в любое время, когда я хочу легко.

сейчас моя главная проблема заключается в том, что этот способ делать вещи замедляет dataGrid, как ад ... У меня есть около 15 свойств, которые я связываю для каждой ячейки, и когда я показываю 100 колос x 20 строк, требуется больше секунды чтобы показать dataGrid, а затем примерно секунду, чтобы обновить его, когда я прокручиваю по горизонтали (мой экран может разрешать только 20 столбцов за раз, а для DataGrid включен виртуализация).

Если я избавлюсь от стиля, время отклика еще больше, чем хотелось бы, но я мог бы с этим справиться.

Так есть лучший способ сделать это?

Я также попытался сделать этот стиль в Xaml, но он, похоже, не справился с виртуализацией столбца, то есть: я бы установил зеленый фон ячейки, затем прокрутил всю страницу вправо, а ячейка, которая попала в такое же положение, как ячейка, которую я нарисовал зеленым, получает событие зеленого цвета, если оно должно быть красным: значение не обновляется до тех пор, пока я не переместил текущую строку в строку, содержащую ячейку ... плюс, казалось, не улучшала производительность на всех ...

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

Edit: General эффект, который я хочу добиться:

  • сетки данных с динамикой столбцов (количество и тип столбцов известны только во время выполнения
  • в любое время, я могу изменить независимо свойство стиля одиночная ячейка: Шрифт (семья, размер, стиль, вес, украшение, если применяется), на переднем плане, фон, textAlignment if any и т. д.

Это именно то, что я должен достичь. знаю, что я обнаружил, что с виртуализацией столбцов вы не можете манипулировать REAL dataGridCells, поскольку они могут еще не отображаться (виртуализованы), а затем вы теряете изменение свойства. Поэтому я пошел на этот «взлом»: я привязываю каждое свойство в фактическом стиле dataGridCell к «логическому», и я изменяю логический. Но это глупо.

Надеюсь, мне удалось объяснить себя немного лучше.

ответ

1

Любой шанс увидеть ваш медленный Xaml? Я бы подумал, что делать это с помощью datatrigger не будет слишком ужасно (также какая версия сетки данных вы используете как .net 4.0, а версии WPF Toolkit различны)

Я делал такие вещи, как это перекрасить выбранные предметы, и это не показалось слишком медленным (это не правильное решение, но я хотел бы получить более подробную информацию, прежде чем я скажу больше):

 <Style TargetType="DataGrid"> 
     <Setter Property="CellStyle"> 
      <Setter.Value> 
       <Style TargetType="DataGridCell"> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Background" Value="{StaticResource SelectedBackgroundBrush}" /> 
          <Setter Property="BorderBrush" Value="{x:Null}" /> 
          <Setter Property="Foreground" Value="White" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

На самом деле я думаю, Я пытаюсь спросить, каков конечный эффект, который вы ищете? Если вы делаете это для 15 свойств, которые не будут хороши для производительности. DataTemplates и триггеры могут быть лучше. – PeterI

+0

@Peterl: спасибо за отзыв, я отредактировал свой вопрос с более подробной информацией, надеюсь, что это поможет вам разобраться в моей проблеме. Использование триггеров в моем случае бессмысленно, так как визуальные свойства не связаны ни с чем. Я просто должен быть в состоянии сказать в любое время: «Эй, эта камера выглядит грустной в сером цвете, давайте дадим ей розовый фон!». Поэтому я просто должен иметь возможность изменить цвет bg ... – David

+0

Я думаю, что я могу видеть, с чем вы собираетесь это сделать (и я скорее надеялся, что вы этого не сделали). Можете ли вы уйти с набором «стилей», а не сплошными цветами? Думаю, мне нужно собрать образец, чтобы играть здесь, чувствуется, что нам нужно либо: а) создать набор стилей («счастливый», «грустный», «сердитый» и т. Д.), Которые затем применяются к каждой ячейке (не могли бы вы уйти с этим?) b) сделать что-то интересное с вызовами SetValue или c) найти способ сделать свойство привязки динамическим. Хммм нужно создать небольшое тестовое приложение. (забыли около 5 минут в поле комментариев) – PeterI

Смежные вопросы