Silverlight的Datagrid的块选择(Silverlight Datagrid Bloc

2019-10-29 18:19发布

我们试图“块选择”添加到Silverlight数据网格控制:用户应该能够选择,例如,细胞从一矩形(第4栏,第5行)至(第6栏第,行8)。

我们正在做的是节省了选择的两个角落,并在视觉上表明它通过设置单元格的背景颜色。 我们碰到的有滚动的麻烦,因为细胞的对象被回收,与他们一起格式化。 所以,你向上滚动,并为所选单元格消失,断底,在顶部即将在细胞的条彩色的! 我试着拯救实际小区对象和“新”的彩色小区的名单是绝对相同的DataGridCell情况下,虽然与当前不同的内容。

我们能够拿到手通过视觉树滚动条,所以我们最终可能会刷新选择显示在垂直滚动条的ValueChanged一个事件处理程序。

但我想知道是否有更好的方法。 我们不是Silverlight的专家。 有没有人试图做到这一点? 有什么明显的Silverlight的高手,我们甚至还没有想什么?

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

Answer 1:

为什么不包含在你的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();
    }
}


文章来源: Silverlight Datagrid Block Selection