Как выделить ячейку в Silverlight DataGrid - PullRequest
0 голосов
/ 08 декабря 2011

Как программно выделить ячейку DataGrid в Silverlight?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Вам нужно будет сделать следующее:

  1. Добавьте свойство (назовем его IsSelectedInChart) к вашему классу элементов данных. Это свойство должно быть public и вызывать событие INotifyPropertyChanged.PropertyChanged при каждом изменении его значения.
  2. В вашем lineseries_SelectionChanged вы найдете элемент данных, который соответствует выбранной точке, и установите для IsSelectedInChart значение true для нее и false для других.
  3. У всех экземпляров DataGridRow, существующих в DataGrid, для Binding установлено значение Background с Path=IsSelectedInChart и пользовательским `IValueConverter '.

Конвертер должен выглядеть так:

public class ValueConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    // TODO: be more careful with nulls and non-expected values
    bool isSelected = (bool)value;
    return isSelected ? new SolidColorBrush(Colors.Red) : DependencyProperty.UnsetValue;
  }
}

Последний шаг самый хитрый. Это может быть реализовано путем переопределения DataGridRow Style. Один подход показан в https://stackoverflow.com/a/4268159/795861,, другой - в https://stackoverflow.com/a/3542179/795861. Проверьте их.

Все эти шаги являются обязательными, поскольку в DataGrid может быть много строк. Он использует виртуализацию пользовательского интерфейса , что делает невозможным простую установку свойства Background для требуемого DataGridRow, поскольку для представления нескольких элементов данных используется объект из одной строки. Таким образом, единственный способ заставить его работать с прокруткой - привязать фон к элементам данных.

UPDATE

Чтобы выделить ячейки в столбце, известном во время разработки, задайте для свойства DataGridColumn.CellStyle это определение столбца вместо установки стиля строки:

<sdk:DataGrid>
  <sdk:DataGrid.Columns>
    <sdk:DataGridTextColumn x:Name="theColumnToHighlight">
      <sdk:DataGridTextColumn.CellStyle>
        <Style TargetType="{x:Type sdk:DataGridCell}">
          <Setter Property="local:SetterValueBindingHelper.PropertyBinding">
            <Setter.Value>
              <local:SetterValueBindingHelper
                  Type="System.Windows.Controls.Control, System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"
                  Property="Background"
                  Binding="{Binding IsSelectedInChart, Converter={StaticResource highlighterConverter}}"/>
            </Setter.Value>
          </Setter>
        </Style>
      </sdk:DataGridTextColumn.CellStyle>
    </sdk:DataGridTextColumn>
  </sdk:DataGrid.Columns>
</sdk:DataGrid>

Должно работать, хотя я не пробовал. Xaml делает то же самое, что я предложил для выделения целых строк, но применяет его к ячейкам в определенном столбце.

0 голосов
/ 09 декабря 2011

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

FrameworkElement cellContent = dataGrid.Columns[0].GetCellContent(dataRow);// datarow is your row where cell intersects.
cellContent .Style = s; // assuming s is the style you want to apply
...