2012-11-20 10 views
5

Próbuję przechodzić przez każdy wiersz w datagrid, wyciągnąć wartość kolumny, przekazać tę wartość do metody i styl tego wiersza na podstawie wyniku metody.Uzyskiwanie datagridrow z widoku danych WPF

Po stwierdzeniu, że nie mogę po prostu przechodzić przez wiersze datagridu znalazłem this po wyszczególnieniu jak to było możliwe.

Zmodyfikowałem nieznacznie, dzięki czemu pracuję z obiektami datarowview.

Problem mam teraz jest, że

var dgRow = grid.ItemContainerGenerator.ContainerFromItem(r) as DataGridRow; 

zawsze zwraca wartość null.

Czy ktoś może doradzić, dlaczego tak się dzieje w moim przypadku i czy może zobaczyć łatwiejszy sposób.

Proszę dać mi znać, jeśli potrzebujesz więcej informacji.

Herezje mój kod:

private void colorArchived(DataGrid grid , GX3MaterialSelectionData data) 
    { 
     var row = GetDataGridRows(grid); 
     foreach (DataRowView r in row) 
     { 
      var dgRow = grid.ItemContainerGenerator.ContainerFromItem(r) as DataGridRow; 
      int val = int.Parse(r.Row[0].ToString()); 
      if (data.IsArchived(val)) 
      { 
       // style will be defined in xaml 
       dgRow.Style = mystyle; 
      } 


     } 

    } 

    public IEnumerable<DataRowView> GetDataGridRows(DataGrid grid) 
    { 
     var itemsSource = grid.ItemsSource as IEnumerable; 
     if (null == itemsSource) yield return null; 
     foreach (var item in itemsSource) 
     { 
      var row = item; 
      if (null != row) yield return (DataRowView)row; 
     } 
    } 

Odpowiedz

0

Można użyć StyleSelector w tym przypadku.

public class RowStyle : StyleSelector 
{ 
    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     // here the item property is the entity that the grid row is bound to. 
     // check whatever values you want on it and locate a matching style with 
     // find resource. 

     // return a reference to the correct style here 

     // or allow this to run if you want the default style. 
     return base.SelectStyle(item, container); 
    } 
} 

Aby użyć go na swojej siatce danych, należy ustawić właściwość RowStyleSelector.

<Window x:Class="Rich.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:Rich" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:RowStyle x:Key="styleSelector"/> 
    </Window.Resources> 
    <Grid> 
     <DataGrid ItemsSource="{Binding Items}" RowStyleSelector="{StaticResource styleSelector}">    
      <DataGrid.Columns> 
       <DataGridTextColumn Header="test" Binding="{Binding Test1}"/> 
       <DataGridTextColumn Header="test2" Binding="{Binding Test2}"/> 
       <DataGridTextColumn Header="test3" Binding="{Binding Test3}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 
1

Jak na swoje pytanie, właśnie zaktualizowana klasa StyleSelector opisane powyżej:

public class RowStyle : StyleSelector 
{ 
    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     var dgRow = item as DataGridRow; 
     int val = int.Parse(dgRow.Row[0].ToString()); 
     if (data.IsArchived(val)) 
     { 
      return Mystyle; 
     } 
     return base.SelectStyle(item, container); 
    } 

    // style will be defined in xaml 
    public Style Mystyle 
    { 
     get; 
     set; 
    } 
} 

UWAGA: Należy opisać „Dane GX3MaterialSelectionData” jako statyczne klasy, tak że powyższy klasa mogła do niego dostęp bezpośrednio.

Powiązane problemy