WPF通用数据网格单元模板-绑定到单元值?
我在理解WPF中数据绑定的基础知识时遇到了问题。我有一个通用的DataGrid(设置了AutoGenerateColumns),它绑定到一个DataTable,该DataTable的列名随每次加载而变化。当dataTable包含boolean类型的列时,我希望呈现一个包含表示true和false的自定义图像的列 为了实现这一点,我在celltemplate页面上声明了一个StaticResource,并使用c#代码捕获AutoGenerateColumn事件并使用此模板:WPF通用数据网格单元模板-绑定到单元值?,wpf,data-binding,datagrid,datatrigger,Wpf,Data Binding,Datagrid,Datatrigger,我在理解WPF中数据绑定的基础知识时遇到了问题。我有一个通用的DataGrid(设置了AutoGenerateColumns),它绑定到一个DataTable,该DataTable的列名随每次加载而变化。当dataTable包含boolean类型的列时,我希望呈现一个包含表示true和false的自定义图像的列 为了实现这一点,我在celltemplate页面上声明了一个StaticResource,并使用c#代码捕获AutoGenerateColumn事件并使用此模板: <DataTem
<DataTemplate x:Key="CheckmarkColumnTemplate">
<Image x:Name="CheckmarkImage" Source="..\..\images\check.png" Height="16" Width="16" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" Value="False">
<Setter TargetName="CheckmarkImage" Property="Source" Value="..\..\images\nocheck.png" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
这基本上是可行的,只是我把DataTrigger绑定属性搞砸了。它从不检测列的值何时为“false”,因此它从不显示nocheck.png图像。我不知道如何编写Binding属性,使其引用列的数据绑定值(请记住,列名每次都不同,因此我无法在绑定的路径部分硬编码列名)
有人能告诉我绑定属性应该是什么样子的,这样它就可以获取列的值吗?我通过使用不同的方法获得了我想要的结果。我没有使用DataGridTemplateColumn,而是使用DataGridCheckBoxColumn,并根据WPF工具包“动手实验”中使用的示例样式设置自定义ElementStyle:
我从实际的DataGrid列设置中读取“IsEnabled”属性时遇到问题(其属性为“IsReadOnly”),但由于我对DataGrid的使用是只读的,因此我在此处将其设置为false。我遇到了同样的问题,仍在寻找答案。我当前的解决方案是在
AutoGeneratingColumn
事件处理程序中创建DataTemplate
,以便DataTemplate
知道属性名称
private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTemplateColumn
{
Header = e.PropertyName,
CellTemplate = CreateSimpleCellTemplate(e.PropertyName)
}
}
private static DataTemplate CreateSimpleCellTemplate(string propertyName)
{
DataTemplate template = new DataTemplate();
template.VisualTree = new FrameworkElementFactory(typeof(Label));
template.VisualTree.SetBinding(ContentProperty, new Binding(propertyName));
return template;
}
我需要你的帮助。我们能在办公室谈一谈吗?请在那里提到我的名字。非常感谢。(◠‿◠)
<Style x:Key="NoBorderCheckBoxStyle" TargetType="{x:Type CheckBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/>
<Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="IsEnabled" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<BulletDecorator SnapsToDevicePixels="true" Background="Transparent">
<BulletDecorator.Bullet>
<Canvas x:Name="canvas" Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5">
<Image x:Name="checkImage" Source="..\..\images\check.png" Height="16" Width="16"></Image>
</Canvas>
</BulletDecorator.Bullet>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
</BulletDecorator>
<ControlTemplate.Triggers>
<Trigger Property="HasContent" Value="True">
<Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
<Setter Property="Padding" Value="4,0,0,0"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Source" TargetName="checkImage" Value="..\..\images\nocheck.png" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTemplateColumn
{
Header = e.PropertyName,
CellTemplate = CreateSimpleCellTemplate(e.PropertyName)
}
}
private static DataTemplate CreateSimpleCellTemplate(string propertyName)
{
DataTemplate template = new DataTemplate();
template.VisualTree = new FrameworkElementFactory(typeof(Label));
template.VisualTree.SetBinding(ContentProperty, new Binding(propertyName));
return template;
}