2011-04-06 73 views
0

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

我们正在做的是保存选择的两个角落,并通过设置单元格的背景颜色来直观地指示它。我们遇到了滚动问题,因为这些单元格对象会随着格式化而被回收。所以你向上滚动,当选定的单元格从底部消失时,顶部进入的单元格条就会被着色!我试过保存一个实际的单元格对象列表,“新”彩色单元格肯定是相同的DataGridCell实例,尽管当然有不同的内容。

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

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

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

回答

3

为什么不在你的viewmodel中包含它。我会做的是创建交互的嵌套可枚举viewmodel,即如果datagrid绑定到T的IEnumerable其中T是代表每行的视图模型,id有像该视图模型上的IndexSelected。 然后ID绑定使用某种到indexselected财产的valueconverter背景色,

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

哇!我正在以完全错误的方式思考这个问题。谢谢!因为我们在网格中有16列,所以我将尝试为所有单元格使用一个单元格模板来减少冗余。我希望我可以不止一次地赞扬这一点。 – 2011-04-08 15:21:08