Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将DataTemplateColumn元素绑定到另一个DataTemplateColumn_C#_Wpf_Data Binding_Datagrid - Fatal编程技术网

C# 无法将DataTemplateColumn元素绑定到另一个DataTemplateColumn

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">

我试图通过在同一行中设置另一个元素来在每个DataGrid行中设置一个元素。
如果
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,因此它们各自的数据上下文绑定不应该相互干扰。