我们正在尝试将“块选择”添加到Silverlight DataGrid控件:用户应该能够选择(例如)从(第4列,第5行)到(第6列,第8行)的单元格矩形。
我们正在做的是保存选区的两个角,并通过设置单元格的背景颜色来直观地指示它。我们在滚动时遇到了麻烦,因为单元格对象以及它们的格式都被回收了。所以你向上滚动,当选定的细胞从底部消失时,顶部的细胞条被着色!我已经尝试保存实际单元格对象的列表,而“新”彩色单元格肯定是相同的DataGridCell实例,但当然具有不同的内容。
我们可以通过可视化树获取滚动条,因此我们最终可能会在垂直滚动条的ValueChanged事件处理程序中刷新选择显示。
但我想知道是否有更好的方法。我们不是Silverlight专家。有人试过这样吗?对于我们甚至没想过的Silverlight高手来说有什么明显的东西吗?
我们不会买任何东西。不幸的是,出于企业官僚主义的原因,这不是一种选择。
答案 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();
}
}