2013-07-28 89 views
1

我曾看過,但尚未找到我正在尋找的確切答案。我有一個DataGrid視圖綁定到數據源。我想在具有datagrid的窗口可見之後以編程方式對列進行樣式設置。我也想根據一些行爲不時地改變它。Datagrid(WPF)以編程方式創建列樣式(不是xaml)

我試圖使用DataGridTemplateColumn,但每當它運行它刪除這些列中的數據。此外,當我嘗試從資源得到它我不明白的單元格樣式(即它總是空)

 private void StyleColumns() 
    { 
     // Replace the DueDate column with a custom template column. 
     for (int i = 0; i < 7; i += 2) 
     { 
      // Create a new template column. 
      DataGridTemplateColumn templateColumn = new DataGridTemplateColumn(); 
      templateColumn.Header = m_DataGrid.Columns[i].Header; 
      Style style = new Style(); 
      templateColumn.CellStyle = (Style)Resources["ColumnGone"]; 
      // ... 
      // Replace the auto-generated column with the templateColumn. 
      m_DataGrid.Columns[i] = templateColumn; 
     } 
    } 

XAML是這樣

     <DataGrid AutoGenerateColumns="True" x:Name="m_grfFileDataGrid" ItemsSource="{Binding cb.GRF}" 
           RowHeight="20" ColumnWidth="*" 
           AlternatingRowBackground="Beige" 
           SelectionUnit="CellOrRowHeader" 
           FontFamily="Consolas" 
           FontSize="12" 
           CanUserReorderColumns="False" 
           CanUserSortColumns="False" 
           CanUserAddRows="False" 
           CanUserDeleteRows="False"> 
         <DataGrid.Resources> 
          <Style TargetType="DataGridCell" x:Key="ColumnGone"> 
           <Setter Property="Background" Value="SeaGreen"/> 
          </Style> 
          <Style x:Key="DisabledColumn"> 
           <Setter Property="DataGridColumn.CanUserResize" 
             Value="False" /> 
           <Setter Property="DataGridColumn.CanUserSort" 
             Value="False" /> 
           <Setter Property="DataGridColumn.CanUserReorder" 
             Value="False" /> 
           <Setter Property="DataGridColumn.CellStyle" 
             Value="{StaticResource ColumnGone}" /> 
          </Style> 
         </DataGrid.Resources> 
        </DataGrid> 

任何幫助,將不勝感激。感謝

+0

嘗試參照風格

另外,對於現有的列設置Style如下所示:'Style style =(Style)m_DataGrid.Resources [「ColumnGone」]; templateColumn.CellStyle = style;'。讓我知道它是否有幫助。 –

+0

非常感謝答案阿納託利。這工作。但是,仍然發生的一個問題是,當我應用樣式時,這些列中的原始數據會丟失。 – ssarangi

回答

3

下面是與Style添加一列的例子:

XAML

<Grid> 
    <DataGrid x:Name="m_DataGrid" Width="400" 
          AutoGenerateColumns="True" 
          HorizontalAlignment="Left" 
          RowHeight="20" ColumnWidth="*" 
          AlternatingRowBackground="Beige" 
          SelectionUnit="CellOrRowHeader" 
          FontFamily="Consolas" 
          FontSize="12" 
          CanUserReorderColumns="False" 
          CanUserSortColumns="False" 
          CanUserAddRows="False" 
          CanUserDeleteRows="False"> 

     <DataGrid.Resources> 
      <Style TargetType="DataGridCell" x:Key="ColumnGone"> 
       <Setter Property="Background" Value="SeaGreen" /> 
       <Setter Property="Foreground" Value="White" /> 
      </Style> 

      <Style x:Key="DisabledColumn"> 
       <Setter Property="DataGridColumn.CanUserResize" 
            Value="False" /> 
       <Setter Property="DataGridColumn.CanUserSort" 
            Value="False" /> 
       <Setter Property="DataGridColumn.CanUserReorder" 
            Value="False" /> 
       <Setter Property="DataGridColumn.CellStyle" 
            Value="{StaticResource ColumnGone}" /> 
      </Style> 
     </DataGrid.Resources> 
    </DataGrid> 

    <Button Name="AddColumn" Content="AddColumn" Width="100" Height="30" HorizontalAlignment="Right" Click="AddColumn_Click" /> 
</Grid> 

Code behind

public class Person 
{ 
    public string Sample 
    { 
     get; 
     set; 
    } 
} 

private ObservableCollection<Person> TestCollection = new ObservableCollection<Person>(); 

public MainWindow() 
{ 
    InitializeComponent(); 

    TestCollection.Add(new Person() 
    { 
     Sample = "Orange", 
    }); 

    TestCollection.Add(new Person() 
    { 
     Sample = "White", 
    }); 

    TestCollection.Add(new Person() 
    { 
     Sample = "Green", 
    }); 

    m_DataGrid.ItemsSource = TestCollection; 
} 

private void StyleColumns() 
{    
    DataGridTextColumn MyColumn = new DataGridTextColumn(); 
    MyColumn.Header = "Test"; 
    MyColumn.Binding = new Binding("Sample"); 

    Style style = (Style)m_DataGrid.Resources["ColumnGone"]; 
    MyColumn.CellStyle = style;   
    m_DataGrid.Columns.Add(MyColumn); 
} 

private void AddColumn_Click(object sender, RoutedEventArgs e) 
{ 
    StyleColumns(); 
} 

最有可能的,你沒有爲新列指出Binding

指定列的名稱:

<DataGridTextColumn x:Name="MySuperColumn" Header="MyColumn" Binding="{Binding Path=Sample}" Width="100" /> 

設置Style代碼:

MySuperColumn.CellStyle = style; 
+0

感謝尼古拉耶夫的回答 – ssarangi

相關問題