![](/img/trans.png)
[英]C# WPF DataGrid: how to color paint text inside DataGrid cells without breaking the DataGrid iteslf?
[英]How to programmatically hide cells of a DataGrid in wpf c#?
有什么方法可以在代码隐藏中隐藏/折叠特定的dataGrid单元格吗? 由于我的数据表列是在运行时创建的,因此我无法指定属性(在XAML中)以正确设置这些数据触发器,模板选择器等。但是,我能够通过循环查找要折叠的确切单元格数据表以将行/列索引添加到列表(如下)。
我知道这是非正统的,但是我已经读了数周的线程来尝试解决这个问题,但是没有任何东西可以帮助我。 这似乎是最简单的解决方案(如果可能)。
private static List<KeyValuePair<int, int>> GetCellsToHide(DataTable pivotTable)
{
var noCellValueList = new List<KeyValuePair<int, int>>();
foreach (DataRow row in pivotTable.Rows)
{
foreach (DataColumn col in pivotTable.Columns)
{
if (row[col].ToString() == "HideMe")
{
int rowIndex = pivotTable.Rows.IndexOf(row);
int colIndex = pivotTable.Columns.IndexOf(col);
noCellValueList.Add(new KeyValuePair<int, int>(rowIndex, colIndex));
}
}
}
return noCellValueList;
}
编辑:数据模板和转换器信息
我目前正在通过自动生成列来构建数据网格。 我知道所有其他列的名称,因此可以缩小到动态生成的列。 我的动态列是DataTemplate5,例如(下面是简化版):
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.Column.Header.ToString() == "Name")
e.Column.Header = "File Name";
else
{
string origHeader = e.Column.Header.ToString();
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn //create new template column
{
Header = origHeader,
CellTemplate = (DataTemplate)Resources["DataTemplate5"]
};
e.Column = templateColumn; // Replace the auto-generated column with the templateColumn.
}
}
但是由于我没有要绑定的属性(列)名称,因此我无法正确绑定它。 这是我通过datatemplate和ivalueconverter隐藏单元格的最新尝试:
<DataTemplate x:Key="DataTemplate5">
<DataTemplate.Resources>
<local:StringToVisibilityConvertor x:Key="VisibilityConvertor" />
</DataTemplate.Resources>
<StackPanel Visibility="{Binding BindsDirectlyToSource=True, Converter={StaticResource VisibilityConvertor}}">
<Button Name="Button1" Click="ButtonClick">
<Button.Style>
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Background" Value="Orange"/>
</Style.Setters>
</Style>
</Button.Style>
</Button>
</StackPanel>
</DataTemplate>
和转换器:
public class StringToVisibilityConvertor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ToString() != "HideMe")
return Visibility.Visible;
return Visibility.Collapsed;
}
由于存在动态列,因此无法使绑定生效。 最后,我偶然发现了Paul Stovell撰写的一篇很棒的文章,内容涉及如何使用列索引作为绑定路径来创建网格。 完成此操作后,我为所有列创建了一个数据模板,并使用datatrigger隐藏了该单元格:
必须承认,在调整列的自动生成方面,我从未走过这么远-我很少使用自动生成的列,尽管我猜您必须这样做,因为您直到运行时才知道这些列。
如果是我,我将这样调整模板:
<DataTemplate x:Key="DataTemplate5">
<Button Name="Button1" Click="ButtonClick" Background="Orange" Content="{Binding ???}" >
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ???}" Value="HideMe">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
节省了转换器的需求。 现在的问题是,该放置什么? 不要尝试-即{Binding}。
您可能还需要在代码后面添加一些内容:
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn //create new template column
{
Header = origHeader,
CellTemplate = (DataTemplate)Resources["DataTemplate5"],
SortMemberPath = e.Column.SortMemberPath
};
实际上,首先尝试一下-可能就足够了,并在值转换器中进行一些调试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.