2012-01-18 81 views
1

我對DataGrid的quastion在WPF .NET更新項目4如何快速在DataGrid中(WPF .NET4)

這裏是一個DataGrid的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> 

而且有窗口方法代碼:

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類代碼:

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

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

問題是,我必須使用方法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"); 
     } 
    } 
} 

有了這個計劃,當你的代碼更改IsRed爲true,用戶將被告知,你的網格將進行適當的更新。這將實現你正在尋找的結果。

DataGrid的'Refresh'方法不適用於對屬性的更改。

+0

BIG THX ...這解決了我的問題;) – MichalDawn 2012-01-18 20:10:59

0

爲什麼你會刷新整個列表?使用適當的數據綁定支持數據源,只有那些需要更新的項目才能使用 - 而且WPF將自動完成透明。

然後你可以在模板位圖緩存輸出,你是安全的。

Items.Refresh刷新整個網格,如果我閱讀正確 - 確保緩慢。