代码之家  ›  专栏  ›  技术社区  ›  Hank

在DataGrid WPF XAML中的数据之间导航

  •  0
  • Hank  · 技术社区  · 10 年前

    我有一些复选框,表示程序中用户可以访问的模块。

    从DataGrid中可以看到,第四列中的模块是从“DataContext.ModuleCollection”创建的,其中DataGrid的行是从UserCollection创建的。我希望User_ID是每个复选框的内容。这将设置为我在底部尝试过的复选框样式,但没有成功。

    我的问题是,复选框位于模块级别(在数据中),我需要找到返回到用户级别以获取User_ID的方法。

    User_ID是行数据集的一部分,例如用户记录。

    问题是如何以以下样式获取User_ID?

    enter image description here

    下面是我的数据网格:

    <DataGrid  ItemsSource="{Binding UserCollection}" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
            <DataGridTextColumn Header="Job Title" Binding="{Binding Path=Job_Title}"/>
            <DataGridTextColumn Header="Company" Binding="{Binding Path=Company}"/>
            <DataGridTemplateColumn CanUserReorder="True">
                <DataGridTemplateColumn.Header>
                    <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.ModuleCollection}" >
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" Background="Transparent" CanVerticallyScroll="False" CanHorizontallyScroll="False"></StackPanel>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Style="{StaticResource ListViewItemRotatedText}" Text="{Binding ModuleName}" >
                                </TextBlock>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.ModuleCollection}" >
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Horizontal" Background="Transparent" CanVerticallyScroll="False" CanHorizontallyScroll="False"></StackPanel>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <CheckBox Style="{StaticResource ListViewItemCheckbox}" />
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    以下是我的支票样式:

    <Style x:Key="ListViewItemCheckbox" TargetType="CheckBox">
            <Setter Property="Content" Value="{Binding Path=User_ID, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"/>
    </Style>
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Sheridan    10 年前

    您当前的 Binding Path 无法工作,因为您正在尝试访问 User_ID 所有物 来自 DataGridRow ,当然,没有。。。你 应该 在Visual Studio的输出窗口中出错。。。请密切注意这些错误,因为它们会帮助您解决问题。

    那又怎么样 绑定路径 可以 你用什么?嗯,就我们必须使用 RelativeSource Binding …请尝试以下操作:

    <Style x:Key="ListViewItemCheckbox" TargetType="CheckBox">
        <Setter Property="Content" Value="{Binding Path=DataContext.User_ID, 
            RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
    </Style>
    

    我们是什么 尝试 这里要做的是将数据绑定到 用户_ID 应在对象集中找到的值 DataContext 数据网格行 .


    更新>>>

    啊,是的,我想的无论如何都不起作用,因为我试图绑定到整个集合,而您需要绑定到当前项目。不过,由于您组织(或不组织)数据模型的方式,您只会遇到这些可怕的问题。那些 CheckBox es应该是来自以下一个或多个财产的数据绑定 事实上 在您的 User class 而不是在这个单独的集合中。在你遇到更严重的问题之前,我现在就把你的模型修好。


    更新2>>>

    现在您需要知道如何绑定到整个数据对象,而不是该对象的属性。请参阅 PropertyPath XAML Syntax 有关详细信息,请访问MSDN上的。然而,你只需要考虑一下。。。如果 DataContext.User_ID 让你 用户_ID 属性值 User 对象,做什么 我想会把整个 使用者 对象这是正确的。。。只需删除属性:

    <Style x:Key="ListViewItemCheckbox" TargetType="CheckBox">
        <Setter Property="Content" Value="{Binding Path=DataContext, 
            RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
    </Style>