2012-01-18 2 views
1

데이터 그리드 (WPF .NET4)에 업데이트 항목을 빠르게하는 방법 4. 여기내가 WPF .NET에서 데이터 그리드에 대한 quastion이

는 데이터 그리드와 XAML 코드 :

<DataGrid Name="m_DataGrid"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Name}"> 
       <DataGridTextColumn.CellStyle> 
        <Style TargetType="{x:Type DataGridCell}"> 
         <Style.Triggers> 
          <Trigger Property="IsSelected" Value="True" > 
           <Setter Property="Background" Value="Gray" /> 
           <Setter Property="Foreground" Value="White" /> 
           <Setter Property="BorderBrush" Value="Gray" /> 
          </Trigger> 
          <DataTrigger Binding="{Binding Path=IsRed}" Value="True"> 
           <Setter Property="Foreground" Value="Red" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </DataGridTextColumn.CellStyle> 
      </DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

그리고 창에 방법이 있습니다 코드 :

public class MyItem 
{ 
    public string Name { get; set; } 
    public bool IsRed { get; set; } 

    public MyItem(string _Name) 
    { 
     Name = _Name; 
     IsRed = false; 
    } 
} 
: 여기

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      m_DataGrid.Items.Add(new MyItem(string.Format("Item {0}", i))); 
     } 
    } 

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Space) 
     { 
      e.Handled = true; 
      ((MyItem)m_DataGrid.SelectedItem).IsRed = !((MyItem)m_DataGrid.SelectedItem).IsRed; 
      m_DataGrid.SelectedIndex++; 
      m_DataGrid.Items.Refresh(); 
     } 
    } 

그리고는 MyItem 클래스 코드입니다

문제는 m_DataGrid.Items.Refresh() 메서드를 사용해야한다는 것입니다. 빨간색으로 항목을 표시합니다. 하지만 내가 예를 들면. 100 항목이 방법은 너무 느립니다. 따라서 스페이스 바를 길게 누르면 아이템이 매우 느리게 붉은 색으로 표시됩니다. 어떻게 더 우아하고 우아한 방법으로 이것을 할 수 있을까요? 새로 고침 방법없이 항목 색상을 변경하는 방법은 무엇입니까? 답변과 조언 주셔서 감사합니다.

답변

1

클래스, MyItem가에서 INotifyPropertyChanged에서 상속해야하며, 같은 선언 IsRed 재산 ...이 구성표

private bool _isRed; 
public bool IsRed 
{ 
    [DebuggerStepThrough] 
    get { return _isRed; } 
    [DebuggerStepThrough] 
    set 
    { 
     if (value != _isRed) 
     { 
      _isRed = value; 
      OnPropertyChanged("IsRed"); 
     } 
    } 
} 

는 가입자가 알림을 그리드는 것이다 적절한 업데이트를하십시오. 이것은 당신이 찾고있는 결과를 얻을 것입니다.

DataGrid의 '새로 고침'메서드는 속성 변경에 적합하지 않습니다.

+0

큰 THX ...이 내 문제를 해결;) – MichalDawn

0

전체 목록을 새로 고치는 이유는 무엇입니까? 적절한 데이터 바인딩을 지원하는 데이터 소스를 사용하여 변경해야하는 항목을 업데이트해야합니다. WPF는 자동으로이를 투명하게 처리합니다.

그런 다음 출력에서 ​​템플릿 비트 맵 캐시를 사용하면 안전 할 수 있습니다.

Items.Refresh는 전체 그리드를 새로 고칩니다. 코드 변경이 true로 IsRed 때

관련 문제