2012-01-18 12 views
1

のDataGrid(WPF .NET4)に更新項目を高速にどの4.ここで私はWPF .NETでのDataGridについてquastionを持って

は、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> 

、ウィンドウ内の方法がありますコード:

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アイテムは、このメソッドが遅すぎます。だから私がスペース・バーを押し下げると、アイテムは非常にゆっくりと赤色でマークされます。どのようにより良い、よりエレガントな方法でこれを行うには? Refreshメソッドを使用せずにアイテムの色を変更する方法は? ご回答いただきありがとうございます。

答えて

1

あなたのクラスは、MYITEMはINotifyPropertyChangedの継承すべきである、とIsRedプロパティは、あなたのコードの変更がtrueにIsRedこの方式で

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

...として宣言され、加入者が通知され、あなたのグリッドがします適切な更新を行います。これはあなたが探している結果を達成するでしょう。

データグリッドの「リフレッシュ」方法は、プロパティの変更のために不適切です。

+0

大きなTHX ...これは私の問題を解決する;) – MichalDawn

0

なぜあなたはリスト全体をリフレッシュしていますか?適切なデータバインディングをサポートするデータソースを使用して、変更が必要なアイテムを更新する必要があります。また、WPFはこれを完全に透過的に自動処理します。

次に、出力をテンプレートのビットマップキャッシュに格納することができ、安全です。必ずそれは遅いです - 私は、右のことを読めば

Items.Refreshは、グリッド全体をリフレッシュします。

関連する問題