2011-04-06 6 views
0

Silverlight DataGrid 컨트롤에 "block select"를 추가하려고합니다. 예를 들어, 사용자는 (col 4, row 5)부터 (col 6 , 행 8).Silverlight Datagrid 블록 선택

우리가하는 일은 선택 영역의 두 구석을 저장하고 셀의 배경색을 설정하여 시각적으로 나타내는 것입니다. 셀 개체는 서식과 함께 재활용되므로 스크롤 문제가 발생했습니다. 그래서 당신은 위로 스크롤하고, 선택된 세포가 바닥에서 사라지면서, 상단에 들어오는 세포 막대가 채색됩니다! 실제 셀 객체 목록을 저장하려고 시도했지만 "새로운"색상의 셀은 물론 다른 내용으로도 동일한 DataGridCell 인스턴스입니다.

시각적 트리를 통해 스크롤바를 사용할 수 있으므로 세로 스크롤 막대에 대한 ValueChanged 이벤트 핸들러에서 선택 표시가 새로 고쳐질 수 있습니다.

하지만 더 좋은 방법이 있는지 알고 싶습니다. 우리는 Silverlight 전문가가 아닙니다. 아무도 이것을 시도한 적이 있습니까? 우리가 생각조차하지 못하는 실버 라이트 호기심에 명백한 것이 있습니까?

우리는 아무것도 사지 않을 것입니다. 불행하게도 기업 관료주의의 이유로 그럴 수는 없습니다.

답변

3

왜 당신을 viewmodel에 포함시키지 않습니까? 내가 무엇을 할 것인가 상호 작용의 중첩 된 열거 형 viewmodel을 만들 것입니다. 즉, DataGrid가 T의 IEnumerable에 바인딩되는 경우 T는 각 행을 나타내는 뷰 모델이고, id는 해당 viewmodel에서 IndexSelected와 같은 것을가집니다. 그런 다음 ID는 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 재산에 어떤 종류의 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 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(); 
    } 
} 
+0

와우! 나는 그것에 대해 완전히 잘못된 생각을하고있었습니다. 고맙습니다! 그리드에 16 개의 열이 있기 때문에 중복성을 줄이기 위해 모든 셀에 대해 하나의 셀 템플릿으로이 작업을 수행하려고합니다. 나는 이것을 한 번 이상 upvote 할 수 있으면 좋겠다. –