【问题标题】:How to add templates for datagrid columns?如何为数据网格列添加模板?
【发布时间】:2013-04-23 08:56:20
【问题描述】:

我正在向数据网格动态添加 itemsource:

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 添加一个新行(带有复选框列) - 复选框是三态的。 我尝试在 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之前Items集合必须为空”。

我是 WPF 新手,请多多指教,如何制作只有两种状态的复选框?

【问题讨论】:

    标签: wpf datagrid itemsource


    【解决方案1】:

    你应该这样写列定义:

      <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>
    

    【讨论】:

      【解决方案2】:

      您可以直接访问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 提供一种样式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 2015-08-29
        相关资源
        最近更新 更多