【发布时间】:2019-05-28 16:59:03
【问题描述】:
我正在尝试通过在同一行中设置另一个元素来在每个 DataGrid 行中设置一个元素。
如果ToggleButton 中的IsChecked 为True,则ContentControl 中的图像将变为可见。
我已经蚕食了这个example 试图让它工作。 This 的例子似乎也很相似,我希望我没有重复任何内容。
这是我的 DataGrid 实现中的代码 sn-p:
<Grid>
<StackPanel>
<Grid Margin="0" Grid.Column="0" Grid.Row="3">
<DataGrid
ItemsSource="{Binding Path=. , Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
Height="Auto"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
x:Name="Filter_grid"
Grid.Row="1">
<DataGrid.Columns >
<DataGridTextColumn Header="CAN ID" Binding="{Binding Information.CAN_ID}" Width="50" />
<DataGridTextColumn Header="Messagen Name" Binding="{Binding Information.CAN_ID_description}" Width="300" />
<DataGridTextColumn Binding="{Binding Information.Status}" Width="50" />
<DataGridTemplateColumn Header = "Filter ON" Width="SizeToCells" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding Information.Tick}">
<ContentControl.Style>
<Style TargetType = "ContentControl" >
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding = "{Binding Path=IsChecked, ElementName=Filter_on}" Value="True">
<Setter Property = "Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="F_column" Header ="Select">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ToggleButton x:Name="Filter_on" Content="Switch" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</StackPanel>
</Grid>
我无法获取 ElementName 以找到 ToggleBox 并获取 Cannot find source for binding with reference 'ElementName=Filter_on'。
我试过做类似的事情
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridTemplateColumn}}, Path=F_column.Filter_on}" Value="True">,或使用x:Reference,这会引发我无法解读的异常。
【问题讨论】:
-
为什么你会假设其中一列是可视树中另一列的祖先?无论如何,您应该将两者绑定到行视图模型的相同属性。网格中的每一行都有该模板的一个实例。它将如何决定绑定到哪一个?因此,模板中的元素名称仅在模板中才有意义。您的第一个示例没有数据模板;第二个绑定到行视图模型的属性。
-
请记住,DataGridColumn 不是 UI 中的事物;它告诉 DataGrid 如何在每一行中生成单元格。
标签: c# wpf data-binding datagrid