我有一个WPF数据网格,它使用MVVM绑定到数据表。此数据表中有几列,其中一列是可以为空的布尔值。渲染数据网格时,布尔列(主要包含空值)显示了填充块的复选框,看起来很糟糕:
如果值为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>
新添加的列确实显示了所需的复选框效果(仅显示了带有值的复选框),但是原始的“付费”列显示了所需的复选框。列不受影响。
有人可以让我知道如何将我的风格绑定到这一列吗?
答案 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;
}
}