2017-02-09 16 views
0

Я добавляю строки в код позади моего DataGrid, определенного в Xaml.Как установить свойство Style в Code Behind for Specific DataRow

DataTable dt = new DataTable(); 
DataRow dr1 = dt.NewRow(); 
DataRow dr2 = dt.NewRow(); 
DataRow dr3 = dt.NewRow(); 

dr1.Style = (Style)Resources.FindName("CustomStyle"); 

dataGrid.ItemSource = dt; 

Ну, у dr1 нет свойства под названием Style, так как я могу это сделать?

Это должно быть довольно просто, но мне тяжело.

Я знаю, что это очень просто сделать в XAML, но это нужно сделать в коде, поскольку я не могу определить количество строк в XAML, так как они будут динамически добавляться.

ответ

0

Чтобы сделать это, вы можете использовать DataTrigger. В приведенном ниже примере, если значение State имеет значение State1, оно будет красным, и если оно равно State2, оно будет Green. Вы можете привязать его к другому свойству вашего данных, другому значению и любому цвету, который вы предпочитаете.

<DataGrid ItemsSource="{Binding YourItemsSource}"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding State}" Value="State1"> 
        <Setter Property="Background" Value="Red"></Setter> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding State}" Value="State2"> 
        <Setter Property="Background" Value="Green"></Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 
+0

Это прекрасно работает, я бы хотел опубликовать раньше! –

+0

Я рад, что смогу помочь. Пожалуйста, прочитайте [это] (http://stackoverflow.com/help/someone-answers) – CodingYoshi

+0

Сделано! Еще раз спасибо. –

0

Это можно сделать в Xaml, как было указано CodingYoshi.

Если вам нужно полное решение codebehind, вы можете обратиться к нему.

public MainWindow() 
    { 
     InitializeComponent(); 


     DataTable dt = new DataTable(); 
     dt.Columns.Add("Col", typeof(string)); 

     DataRow dr1 = dt.NewRow(); 
     dr1[0] = "row1" ; 
     DataRow dr2 = dt.NewRow(); 
     dr2[0] = "row2"; 
     DataRow dr3 = dt.NewRow(); 
     dr3[0] = "row3"; 

     dt.Rows.Add(dr1); 
     dt.Rows.Add(dr2); 
     dt.Rows.Add(dr3); 

     dataGrid.ItemsSource = dt.AsDataView(); 

     dataGrid.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; 
    } 

    private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) 
    { 
     // This will ensure, items are generated over UI. 
     if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
     { 
      int index = 1; // add logic to get index of row to be styled. 
      var row = (DataGridRow)dataGrid.ItemContainerGenerator 
               .ContainerFromIndex(index); 

      // creating style, can be picked from resources aswell. 
      Style style = new Style 
      { 
       TargetType = typeof(Control) 
      }; 

      style.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Green)); 
      // Applied logic 
      row.Style = style; 
     } 
    }