Silverlight数据网格块选择

时间:2011-04-06 19:23:05

标签: silverlight silverlight-4.0 wpfdatagrid

我们正在尝试将“块选择”添加到Silverlight DataGrid控件:用户应该能够选择(例如)从(第4列,第5行)到(第6列,第8行)的单元格矩形。

我们正在做的是保存选区的两个角,并通过设置单元格的背景颜色来直观地指示它。我们在滚动时遇到了麻烦,因为单元格对象以及它们的格式都被回收了。所以你向上滚动,当选定的细胞从底部消失时,顶部的细胞条被着色!我已经尝试保存实际单元格对象的列表,而“新”彩色单元格肯定是相同的DataGridCell实例,但当然具有不同的内容。

我们可以通过可视化树获取滚动条,因此我们最终可能会在垂直滚动条的ValueChanged事件处理程序中刷新选择显示。

但我想知道是否有更好的方法。我们不是Silverlight专家。有人试过这样吗?对于我们甚至没想过的Silverlight高手来说有什么明显的东西吗?

我们不会买任何东西。不幸的是,出于企业官僚主义的原因,这不是一种选择。

1 个答案:

答案 0 :(得分:3)

为什么不在viewmodel中包含它。我要做的是创建交互的嵌套可枚举视图模型,即如果数据网格绑定到T的IEnumerable,其中T是表示每行的视图模型,则id在该视图模型上具有类似IndexSelected的内容。 然后id使用某种类型的valueconverter将背面颜色绑定到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>

并且所有转换器都会检查indexselected bound属性是否等于参数(这是列的索引)

 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();
    }
}