在DataGrid WPF XAML中的数据之间导航
我有一些复选框,表示用户可以访问的程序中的模块 您可以从DataGrid中看到,第四列中的模块是从“DataContext.ModuleCollection”创建的,其中DataGrid的行是从UserCollection创建的。我希望用户ID是每个复选框的内容。这将设置为复选框样式,我在底部尝试了这种样式,但没有取得多大成功 我的问题是,复选框位于模块级别(数据中),我需要找到一种方法返回到用户级别以获取用户ID 用户ID是行数据集的一部分,例如用户记录 问题是如何获得以下样式的用户ID 下面是我的数据网格:在DataGrid WPF XAML中的数据之间导航,wpf,xaml,wpfdatagrid,Wpf,Xaml,Wpfdatagrid,我有一些复选框,表示用户可以访问的程序中的模块 您可以从DataGrid中看到,第四列中的模块是从“DataContext.ModuleCollection”创建的,其中DataGrid的行是从UserCollection创建的。我希望用户ID是每个复选框的内容。这将设置为复选框样式,我在底部尝试了这种样式,但没有取得多大成功 我的问题是,复选框位于模块级别(数据中),我需要找到一种方法返回到用户级别以获取用户ID 用户ID是行数据集的一部分,例如用户记录 问题是如何获得以下样式的用户ID 下
<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>
您当前的
绑定路径将无法工作,因为您试图从DataGridRow
访问用户ID
属性,当然,该属性没有一个。。。您在Visual Studio中的输出窗口中应该有错误。。。密切关注这些错误,因为它们将帮助您解决问题
那么您可以使用什么绑定路径
?好吧,你是对的,因为我们必须使用相对资源绑定
。。。请尝试以下方法:
<Style x:Key="ListViewItemCheckbox" TargetType="CheckBox">
<Setter Property="Content" Value="{Binding Path=DataContext.User_ID,
RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
</Style>
我希望用户ID是每个复选框的内容。您想在该行的所有五个复选框中显示每行相同的User\u ID
值吗?是的,这可能看起来很奇怪,但我只想知道如何从中获取引用。我最终会将这个问题发送到与复选框相同级别的转换器。这是我第四次重新措辞这个问题,因此我非常感谢您在这方面的帮助!我知道。。。很难理解。。。现在回答。让我看看你要去哪里,但是它在输出窗口中返回了以下内容:System.Windows.Data警告:40:BindingExpression路径错误:“在“对象”“模块”(HashCode=62906887)上找不到User_ID”属性。BindingExpression:Path=User\u ID;DataItem='Module'(HashCode=62906887);目标元素为“复选框”(名称=“”);目标属性为“NoTarget”(类型为“Object”)“System.InvalidCastException”类型的第一次意外异常发生在UserManagement中。dllI明白您的意思,为每个用户创建一个模块集合吗?尽管如此,必须有一种方法(如果不是这样的话)才能从复选框中找到用户ID。Nevermind刚刚找到它,将x:Type DataGrid替换为DataGridRow,它已经完成了。感谢您的耐心,我将把您关于数据模型的建议付诸行动,并回答更多相关问题。如果我想从同一个位置绑定到用户对象,而不是它的某个属性,你会怎么做?
<Style x:Key="ListViewItemCheckbox" TargetType="CheckBox">
<Setter Property="Content" Value="{Binding Path=DataContext,
RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
</Style>