2013-04-23 2 views
1

Я добавляю динамически в ItemSource к сетке:Как добавить шаблоны для столбцов datagrid?

datagrid.ItemsSource = _table.DefaultView; 
      foreach (DataColumn column in _table.Columns) 
      { 
       if (column.DataType == typeof(bool)) 
       { 
        var dgrcl = new DataGridCheckBoxColumn 
         { 
          IsThreeState = false, 
          Header = column.Caption, 
          Binding = new Binding(column.ColumnName), 
          Width = new DataGridLength(15, DataGridLengthUnitType.Star) 
         }; 
        datagrid.Columns.Add(dgrcl); 
       } 
       else 
       { 
        var dgrcl = new DataGridTextColumn(); 
        dgrcl.Binding = new Binding(column.ColumnName); 
        dgrcl.Header = column.Caption; 
        datagrid.Columns.Add(dgrcl); 
       } 
      } 

Но если добавить новую строку в Datagrid (с checkboxcolumn) - флажок не threestate. Я пытался добавить следующий код в XAML:

<Style TargetType="CheckBox" x:Key="dgrChkBoxStyle"> 
      <Setter Property="IsThreeState" Value="False"></Setter> 
      <Setter Property="IsChecked" Value="True"></Setter> 
     </Style> 
<DataGrid Name="datagrid" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" AlternatingRowBackground="Honeydew" AlternationCount="2" AutoGenerateColumns="False"> 
      <DataGridCheckBoxColumn> 
       <DataGridCheckBoxColumn.ElementStyle> 
        <Style TargetType="CheckBox" BasedOn="{StaticResource dgrChkBoxStyle}"></Style> 
       </DataGridCheckBoxColumn.ElementStyle> 
      </DataGridCheckBoxColumn> 
     </DataGrid> 

Но есть исключение, что «коллекция предметов должна быть пустой перед использованием ItemsSource».

Я новичок в WPF, пожалуйста, советую, как сделать флажки только с двумя состояниями?

ответ

0

вы должны написать определение столбца следующим образом:

<DataGrid Name="datagrid" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" AlternatingRowBackground="Honeydew" AlternationCount="2" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn> 
       <DataGridCheckBoxColumn.ElementStyle> 
        <Style TargetType="CheckBox" BasedOn="{StaticResource dgrChkBoxStyle}"></Style> 
       </DataGridCheckBoxColumn.ElementStyle> 
      </DataGridCheckBoxColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
0

Вы можете получить доступ к DataGridCheckBoxColumn непосредственно. Как насчет?

<Style x:Key="DgCheckBoxColumnStyle" x:TargetType="{x:Type DataGridCheckBoxColumn}"> 
    <Setter Property="IsThreeState" Value="False" /> 
    <Setter Property="Binding" Value="{Binding <SomePath>, TargetNullValue="True"}" /> 
</Style> 

<DataGridCheckBoxColumn Style="{StaticResource DgCheckBoxColumnStyle}" /> 

Для получения дополнительной информации, пожалуйста, обратитесь к msdn. Должно быть проще, чем вы пытаетесь достичь этого.

Если вы действительно хотите получить доступ к элементам управления в столбцах, вы должны указать один стиль для DataGridBoundColumn.ElementStyle и один для DataGridBoundColumn.EditingElementStyle.

Смежные вопросы