Выбор блока данных Silverlight - PullRequest
0 голосов
/ 06 апреля 2011

Мы пытаемся добавить «выбор блока» к элементу управления Silverlight DataGrid: пользователь должен иметь возможность выбирать, например, прямоугольник ячеек от (столбец 4, строка 5) до (столбец 6, строка 8) ,

Что мы делаем, это сохраняем два угла выделения и видим его визуально, устанавливая цвет фона ячеек. У нас возникли проблемы с прокруткой, потому что объекты ячеек перерабатываются вместе с их форматированием. Таким образом, вы прокручиваете вверх, и когда выделенные ячейки исчезают снизу, полосы ячеек, появляющиеся сверху, окрашиваются! Я попытался сохранить список реальных объектов ячеек, и «новые» цветные ячейки - это, безусловно, те же экземпляры DataGridCell, хотя с разным содержанием, конечно.

Мы можем получить доступ к полосам прокрутки через визуальное дерево, поэтому в конечном итоге мы можем обновить отображение выбора в обработчике событий ValueChanged для вертикальной полосы прокрутки.

Но я хотел бы знать, есть ли лучший способ. Мы не эксперты Silverlight. Кто-нибудь пытался это сделать? Есть ли что-то очевидное для свиста Silverlight, о котором мы даже не думаем?

Мы не собираемся ничего покупать. По причинам корпоративной бюрократии, к сожалению, это не вариант.

1 Ответ

3 голосов
/ 06 апреля 2011

Почему бы не включить это в вашу viewmodel. То, что я хотел бы сделать, это создать вложенную перечисляемую модель представления взаимодействия, т. Е. Если сетка данных связана с IEnumerable из T, где T - это модель представления, представляющая каждую строку, у id есть что-то вроде IndexSelected для этой модели представления. Затем id привязывает задний цвет, используя какой-либо преобразователь значения к этому свойству indexselected,

public class RowViewModel
{
   public string Col1 { get; set; }
   public string Col2 { get; set; }
   public string Col3 { get; set; }

   public int IndexSelected { get; private set; }

   //Id also make a command here or something to set the indexselected but ill leave that for you :)

}

public class GridViewModel
{
    public ObservableCollection<RowViewModel> Rows; // Bound to Datagrid.ItemsSource.
}

Обратите внимание, что параметр преобразователя в привязке indexselected содержит индекс столбца

 <sdk:DataGrid>
        <sdk:DataGrid.Columns>
            <sdk:DataGridTemplateColumn Header="Col1">
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid Background="{Binding IndexSelected, Converter={StaticResource IndexToColorConverter}, ConverterParameter=1}">
                            <TextBlock Text="{Binding Col1}" />
                        </Grid>
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn Header="Col2">
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid Background="{Binding IndexSelected, Converter={StaticResource IndexToColorConverter}, ConverterParameter=2}">
                            <TextBlock Text="{Binding Col2}" />
                        </Grid>
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>

        </sdk:DataGrid.Columns>
    </sdk:DataGrid>

и все, что нужно сделать конвертеру, это проверить, равно ли свойство привязанного индекса выбранному параметру (который является индексом столбца)

 public class IndexToColorConverter : IValueConverter
 {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
         if (value == parameter)
        {
            return new SolidColorBrush(Colors.Red);
        }
        return new SolidColorBrush(Colors.White);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
...