我们试图“块选择”添加到Silverlight数据网格控制:用户应该能够选择,例如,细胞从一矩形(第4栏,第5行)至(第6栏第,行8)。
我们正在做的是节省了选择的两个角落,并在视觉上表明它通过设置单元格的背景颜色。 我们碰到的有滚动的麻烦,因为细胞的对象被回收,与他们一起格式化。 所以,你向上滚动,并为所选单元格消失,断底,在顶部即将在细胞的条彩色的! 我试着拯救实际小区对象和“新”的彩色小区的名单是绝对相同的DataGridCell情况下,虽然与当前不同的内容。
我们能够拿到手通过视觉树滚动条,所以我们最终可能会刷新选择显示在垂直滚动条的ValueChanged一个事件处理程序。
但我想知道是否有更好的方法。 我们不是Silverlight的专家。 有没有人试图做到这一点? 有什么明显的Silverlight的高手,我们甚至还没有想什么?
我们不会买任何东西。 对于企业官僚主义的原因,不幸的是,这不是一个选项。
为什么不包含在你的ViewModel。 我会做的是创造互动的嵌套枚举视图模型,即如果DataGrid绑定到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约束力转换PARAM持有列的索引
<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绑定属性等于参数(这是列的索引)
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();
}
}