绑定到一列datagrid并应用样式

时间:2016-02-01 10:55:49

标签: c# wpf mvvm datagrid styles

我有一个WPF数据网格,它使用MVVM绑定到数据表。此数据表中有几列,其中一列是可以为空的布尔值。渲染数据网格时,布尔列(主要包含空值)显示了填充块的复选框,看起来很糟糕:

当前:Nullable text box column所需:Hidden check boxes

如果值为null,我想在此列中添加样式以隐藏所有复选框。 这个问题类似于apply a template to a column of datagrid,但我无法手动定义XAML中的每一列,因为绑定数据表中列的数量和位置可能会发生变化。

我的数据表在视图模型中定义为:

    public DataTable Data
    {
        get { return data; }
        set
        {
            data = value;
            OnPropertyChanged("Data");
        }
    }

并通过调用返回数据表的SQL存储过程在类构造函数中设置。此存储过程可能因使用情况而异,因此将在不同时间生成不同的数据表。

目前,我有这段代码:

          <DataGrid ItemsSource="{Binding Data, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn Binding="{Binding Paid}" Header="Paid?">
                        <DataGridCheckBoxColumn.ElementStyle>
                            <Style TargetType="CheckBox">
                                <Style.Triggers>
                                    <Trigger Property="IsChecked" Value="{x:Null}">
                                        <Setter Property="Visibility" Value="Hidden"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DataGridCheckBoxColumn.ElementStyle>
                    </DataGridCheckBoxColumn>
                </DataGrid.Columns>
            </DataGrid>

但是,添加此代码已更改我的datagrid列: Headers before change

并且只是在网格的开头添加了一个新的复选框列: Headers after change

新添加的列确实显示了所需的复选框效果(仅显示了带有值的复选框),但是原始的“付费”列显示了所需的复选框。列不受影响。

有人可以让我知道如何将我的风格绑定到这一列吗?

1 个答案:

答案 0 :(得分:1)

您目前将AutoGenerateColumns设置为true,这意味着DataGrid将首先使用您的自定义列定义,然后将其自己的定义附加到DataGrid这就是为什么你得到第一个&#34;付费?&#34;列,然后是其余自动生成的列。

要获得所需的布局,您可以将AutoGenerateColumns设置为false并提供列的所有定义。

否则,请尝试将本地资源分配给DataGrid,以使用您的自定义DataGridCheckBoxColumns设置所有ElementStyle的样式。另请注意,您只需在列上将IsThreeState属性设置为false即可停止显示{x:Null}状态。

<强>更新

仔细研究一下,DataGridCheckBoxColumn样式设置为AutoGenerateColumns true可能会出现问题。您需要处理AutoGeneratingColumn事件并在处理程序中设置ElementStyle

类似于:

void grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if(e.Column is DataGridCheckBoxColumn)
    {
        var checkBoxColumn = e.Column as DataGridCheckBoxColumn;
        var resource =     Application.Current.FindResource(typeof(CheckBox));
        checkBoxColumn.ElementStyle = resource as Style;
    }
}

来源:http://www.jonathanantoine.com/2011/09/06/wpfs-datagridcheckboxcolumn-elementstyle-uses-a-wrong-default-value/