2011-04-01 1 views
0

입력 된 데이터 집합에 바인딩 된 (MVVM) DataGrid가있는 wpf 앱이 있습니다. 데이터가 자동으로 생성 된 열을 표시합니다.형식화 된 데이터 집합에 바인딩 된 WPF DataGrid입니다. 목록을 기반으로 개별 셀 배경색을 강조 표시합니다. <Point>

"나쁜"데이터가있는 셀을 나타내는 (ViewModel) List 컬렉션도 있습니다. 포인트 목록에 해당하는 DataGrid의 개별 셀에 대한 배경색을 변경하고 싶습니다. 각 셀을 개별적으로 액세스하는 방법을 알 수 없습니다.

문제 목록에있는 변환기를 사용해 보았지만 그 당시 어떤 셀 (X 및 Y)인지 알 수있는 방법이 없다는 것을 깨달았습니다.

GridData_OnAutoGeneratedColumns 이벤트를 시도했지만 개별 셀을 참조하는 방법을 알 수 없습니다.

나는 flumaxed입니다.

감사

+0

이 (목록 에)이 _'point'_ (즉,이 데이터 집합의 각 행은 열 이름을 가질 수 있습니다 'IsBad'로 입력 된 데이터 세트의 일부가 될 수 있습니다 부울 va lue)? 이 경우에는 변환기를 사용하여 백그라운드를 부울로 바인딩 할 수 있습니다. – publicgk

+0

@publicgk 안타깝게도 전체 셀을 표시하는 것은 옵션이 아닙니다. – Jon

+0

그래서 포인트의 X, Y는 DataGrid의 x, y 셀 번호를 나타 냅니까? – publicgk

답변

1

같은 문제가 여기에 다시 방문의 생각에 new question을 보았다.

음,이 귀하의 요구에 맞게해야한다 : 당신이해야 할 것은 Get cell value from WPF Datagrid

:
1. 때 아래의 로직을 실행하는 특정 시간을 찾아보세요. 이상적으로는 DataGrid를 바인딩 한 후에해야합니다.
2. 귀하의 List<x,y>을 반복하십시오.
3. List<x,y>의 각 항목에 대해 참조 된 링크의 GetCell 도우미 함수를 호출하고 DataGridCell에 액세스합니다.
4. DataGridCell의 색을 변경하거나 원하는대로 수행하십시오.

참고 :
1. 로직을 실행하려면 appropritate time (1 단계)을 찾아야합니다.
2.이 솔루션은 MVVM에 대한 것입니다. 그러나, 당신은 특별한 필요가 있기 때문에, 그것은 충분해야합니다.
3.이 링크의 질문은 기본적으로 DataGridCell의 값을 가져 오려합니다. 그러나 값이 아닌 배경색 만 변경하려는 경우 해당 도우미 함수에서 반환하는 DataGridCell에 만족해야합니다.
4. GetRow 함수 코드는 해당 링크에서 언급되지 않습니다. 그러나 코드를 다운로드하고 GetRow 메서드를 볼 수있는 문서를 참조하십시오.
5. 가상화는 기본적으로 DataGrid에서 설정됩니다. 따라서 화면에 표시되지 않는 DataGridCell은 만들어지지 않습니다. 헬퍼 함수를 ​​그대로 사용하고 데이터 격자가 큰 경우 헬퍼 함수가 요청 된 모든 셀을 스크롤하여 뷰에 표시하려고하기 때문에 매우 느리게로드 될 수 있습니다. DataGrid의 LoadingRow 및 UnloadingRow 이벤트를 살펴볼 수 있습니다.

:

은 내가 데이터 그리드 셀의 스타일에 다중 값 변환기를 가지고 :
+0

다른 해결책을 찾는데 도움이되었습니다 (여기에 게시 됨). 감사 – Jon

0

는) 지금까지 (최적하지만 작동하는 것 같다 만약 내가 내 문제, (확실하지를 해결하는 방법입니다
 <Style TargetType="{x:Type DataGridCell}"> 
      <Style.Setters> 
       <Setter Property="Background"> 
        <Setter.Value> 
         <MultiBinding Converter="{StaticResource onErrorConverter}"> 
          <Binding RelativeSource="{RelativeSource Self}" /> 
          <Binding RelativeSource="{RelativeSource AncestorType=SampleTests:SampleTestUserControlBase}" Path="DataContext.Problems" /> 
          <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}" /> 
         </MultiBinding> 
        </Setter.Value> 
       </Setter> 
      </Style.Setters> 
     </Style> 

그리고 컨버터 :

public class DataGridCellOnErrorConversion : IMultiValueConverter 
{ 
    private readonly SolidColorBrush DefaultColour = new SolidColorBrush(Colors.White); 
    private readonly SolidColorBrush ErrorColour = new SolidColorBrush(Colors.Red); 
    private readonly SolidColorBrush AlternatingColour = new SolidColorBrush(Colors.AliceBlue); 


    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Length < 3) 
      return DefaultColour; 

     DataGridCell dgc = values[0] as DataGridCell; 
     if(dgc == null) 
      return DefaultColour; 

     IList<Point> problems = values[1] as IList<Point>; 
     if(problems == null) 
      return DefaultColour; 

     DataGrid grid = values[2] as DataGrid; 
     if (grid == null) 
      return DefaultColour; 
     int x; 
     int y = -1; 

     ItemCollection itemCollection = grid.Items; 

     for (int i = 0; i < itemCollection.Count; i++) 
     { 
      if (itemCollection.CurrentItem == itemCollection[i]) 
       y = i; 
     } 

     x = dgc.Column.DisplayIndex; 

     DataRowView currentRowView = null; 
     FieldInfo fi = dgc.GetType().GetField("_owner", BindingFlags.NonPublic | BindingFlags.Instance); 
     try 
     { 
      if (fi != null) 
      { 
       DataGridRow dataGridRow = fi.GetValue(dgc) as DataGridRow; 
       if(dataGridRow != null) 
        currentRowView = dataGridRow.Item as DataRowView; 
      } 
     } 
     catch (InvalidCastException) { } 

     if(currentRowView != null) 
     { 
      for (int i = 0; i < itemCollection.Count; i++) 
      { 
       if (currentRowView == itemCollection[i]) 
        y = i; 
      } 
     } 

     if (problems.Any(problem => System.Convert.ToInt32(problem.X) == x && System.Convert.ToInt32(problem.Y) == y)) 
     { 
      return ErrorColour; 
     } 

     return y % 2 == 0 ? AlternatingColour : DefaultColour; 
    } 
} 
관련 문제