2011-04-06 79 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