如何在数据网格组扩展器 header 中获取 parent 个节点
How to get parent nodes in data grid group expander header
我在 WPF 应用程序中有一个包含分组数据的数据网格。对于组 header,我有一个上下文菜单来删除该组。数据网格的项目源与我的 object 绑定。
如何检测扩展器header的parent/parents组?
我试过这样做,但它 returns 无效。
private void buttonDeleteHeader_Click(object sender, RoutedEventArgs e)
{
MenuItem menuItem = sender as MenuItem;
TextBlock header = menuItem.Parent as TextBlock;
}
数据分组
m_infoList = new ObservableCollection<MyDataObject>();
m_infoList .Add(new MyDataObject
{ ID = 1, Attr1 = "Level1", Attr2 = "Level2", Attr3 ="Level3", Attr4 = "Child1"});
m_infoList .Add(new MyDataObject
{ ID = 2, Attr1 = "Level1", Attr2 = "Level2", Attr3 ="Level3", Attr4 = "Child2"});
CollectionView collectionView = (CollectionView)CollectionViewSource.GetDefaultView(m_infoList);
PropertyGroupDescription groupDescription1 = new PropertyGroupDescription("Attr1");
PropertyGroupDescription groupDescription2 = new PropertyGroupDescription("Attr2");
PropertyGroupDescription groupDescription3 = new PropertyGroupDescription("Attr3");
collectionView.GroupDescriptions.Clear();
collectionView.GroupDescriptions.Add(groupDescription1);
collectionView.GroupDescriptions.Add(groupDescription2);
collectionView.GroupDescriptions.Add(groupDescription3);
UI
数据网格代码
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding InfoList, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ....>
...
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander x:Name="MyExpander" IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="MyExpanderHeader" Text="{Binding Name}" FontWeight="Bold" VerticalAlignment="Bottom"
ToolTip="Right click to delete">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Click="buttonDeleteHeader_Click">
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</StackPanel>
</Expander.Header>
<ItemsPresenter Margin="20,0,0,0"/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
这样做:
MenuItem item = sender as MenuItem;
ContextMenu ctxMenu = (ContextMenu) item.Parent;
// ctxMenu.Parent will give you `Popup`
TextBlock tb = (TextBlock) ctxMenu.PlacementTarget;
要遍历关卡,您可以使用 RelativeSource
及其 AncestorLevel
属性(如果您使用的是 Binding
),并且可以通过编程方式使用 VisualTreeHelper
class 并像这样向上遍历:
DependencyObject parent = VisualTreeHelper.GetParent(tb);
while (parent.GetType() != typeof(Expander))
parent = VisualTreeHelper.GetParent(parent);
使用Snoop工具检查可视化树,并进行相应的遍历。
我在 WPF 应用程序中有一个包含分组数据的数据网格。对于组 header,我有一个上下文菜单来删除该组。数据网格的项目源与我的 object 绑定。 如何检测扩展器header的parent/parents组? 我试过这样做,但它 returns 无效。
private void buttonDeleteHeader_Click(object sender, RoutedEventArgs e)
{
MenuItem menuItem = sender as MenuItem;
TextBlock header = menuItem.Parent as TextBlock;
}
数据分组
m_infoList = new ObservableCollection<MyDataObject>();
m_infoList .Add(new MyDataObject
{ ID = 1, Attr1 = "Level1", Attr2 = "Level2", Attr3 ="Level3", Attr4 = "Child1"});
m_infoList .Add(new MyDataObject
{ ID = 2, Attr1 = "Level1", Attr2 = "Level2", Attr3 ="Level3", Attr4 = "Child2"});
CollectionView collectionView = (CollectionView)CollectionViewSource.GetDefaultView(m_infoList);
PropertyGroupDescription groupDescription1 = new PropertyGroupDescription("Attr1");
PropertyGroupDescription groupDescription2 = new PropertyGroupDescription("Attr2");
PropertyGroupDescription groupDescription3 = new PropertyGroupDescription("Attr3");
collectionView.GroupDescriptions.Clear();
collectionView.GroupDescriptions.Add(groupDescription1);
collectionView.GroupDescriptions.Add(groupDescription2);
collectionView.GroupDescriptions.Add(groupDescription3);
UI
数据网格代码
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding InfoList, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ....>
...
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander x:Name="MyExpander" IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="MyExpanderHeader" Text="{Binding Name}" FontWeight="Bold" VerticalAlignment="Bottom"
ToolTip="Right click to delete">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Click="buttonDeleteHeader_Click">
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</StackPanel>
</Expander.Header>
<ItemsPresenter Margin="20,0,0,0"/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
这样做:
MenuItem item = sender as MenuItem;
ContextMenu ctxMenu = (ContextMenu) item.Parent;
// ctxMenu.Parent will give you `Popup`
TextBlock tb = (TextBlock) ctxMenu.PlacementTarget;
要遍历关卡,您可以使用 RelativeSource
及其 AncestorLevel
属性(如果您使用的是 Binding
),并且可以通过编程方式使用 VisualTreeHelper
class 并像这样向上遍历:
DependencyObject parent = VisualTreeHelper.GetParent(tb);
while (parent.GetType() != typeof(Expander))
parent = VisualTreeHelper.GetParent(parent);
使用Snoop工具检查可视化树,并进行相应的遍历。