C# 无法将DataTemplateColumn元素绑定到另一个DataTemplateColumn
我试图通过在同一行中设置另一个元素来在每个DataGrid行中设置一个元素。C# 无法将DataTemplateColumn元素绑定到另一个DataTemplateColumn,c#,wpf,data-binding,datagrid,C#,Wpf,Data Binding,Datagrid,我试图通过在同一行中设置另一个元素来在每个DataGrid行中设置一个元素。 如果ToggleButton的IsChecked为True,则ContentControl中的图像将变为可见 我把它拆了,想让它工作。这个例子似乎也很相似,我希望我没有重复任何东西 这是我的DataGrid实现中的代码片段: <Grid> <StackPanel> <Grid Margin="0" Grid.Column="0" Grid.Row="3">
如果
ToggleButton
的IsChecked
为True,则ContentControl
中的图像将变为可见
我把它拆了,想让它工作。这个例子似乎也很相似,我希望我没有重复任何东西
这是我的DataGrid实现中的代码片段:
<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以找到切换框,并且获取无法找到引用'ElementName=Filter_on'
绑定的源代码
我试过和你做同样的事
,或者使用x:Reference
,这会引发我无法破译的异常。第一件事:你永远不应该这样做。XAML非常灵活,允许您做一些非常聪明的事情,但仅仅因为您可以,并不意味着您应该这样做。在这种情况下,正确的解决方案是为每个行元素创建一个视图模型,其中包含按钮和数据触发器都可以绑定的布尔属性。除了更灵活之外,它还更易于测试、调试和记录等
也就是说,你所要求的在技术上是可能的。由于DataGrids采用了各种优化等,因此实际上非常复杂,因此您仍然需要使用中间属性,但由于您不想使用视图模型,因此必须使用按钮DataGridCell中的标记属性(可用于任意用户数据):
绑定按钮的IsChecked
属性,以实现与其父DataGridCell的标记的单向源绑定
绑定DataTrigger以查找父级DataGridCellsPanel
,然后直接绑定到相应子级的标记
属性,即子级[1]。标记
把它放在一起,你会得到:
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header = "Filter ON" Width="SizeToCells" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType = "ContentControl" >
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding = "{Binding Path=Children[1].Tag, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" Value="True">
<Setter Property = "Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
<TextBlock Text="Content goes here" />
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="F_column" Header ="Select">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ToggleButton x:Name="Filter_on" Content="Switch" IsChecked="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType=DataGridCell}, Mode=OneWayToSource}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
但说真的……只需使用视图模型。为什么您会认为其中一列是另一列的祖先(在可视化树中)?无论如何,您应该将两者绑定到row viewmodel的同一属性。网格中的每一行都有该模板的一个实例。它将如何决定绑定到哪一个?因此,模板中的元素名称只有在模板中才有意义。您的第一个示例没有数据模板;第二个绑定到row viewmodel的属性;它告诉DataGrid如何生成每行中的单元格。嘿,谢谢你的详细回答。我想我确实使用了ViewModel,这些行中的每一行都有一个模型,它们是在背景代码中指定的。我只想看看如何在XAMl中设置这些,我在分配相对路径方面有些困难。在我的问题中,我已经更新了代码,我无法使用代码的第一行,因为我正在绑定到其他属性以获取行。对不起,我没有跟上你,你特别指的是哪一行?除了必须绑定到子项[4]。标记而不是子项[1]。标记之外,我在更新的代码中看不到任何不同之处。两个标记
绑定都使用到祖先的RelativeSource,因此它们各自的数据上下文绑定不应该相互干扰。