Как добавить шаблоны для столбцов сетки данных?
Я динамически добавляю источник данных в сетку данных:
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) - флажок будет трехсторонним. Я пытался добавить следующий код в 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>
Но есть исключение, что "Коллекция Items должна быть пустой перед использованием ItemsSource".
Я новичок в WPF, пожалуйста, любой совет, как сделать флажки только с двумя состояниями?
2 ответа
Вы должны написать определение столбца так:
<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>
Вы можете получить доступ к 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.