积极答复者
如何设计内容变动的ContextMenu?

问题
-
我有一个TreeView,在TreeViewItem 设置了ContextMenu
<TreeView Name="treeViewAp"> <TreeViewItem Header="A"> <TreeViewItem Header="1" Foreground="White" /> <TreeViewItem Header="2" Foreground="White" /> </TreeViewItem> <TreeViewItem Header="B" > <TreeViewItem Header="3" Foreground="White" /> <TreeViewItem Header="4" Foreground="White" /> </TreeViewItem> <TreeViewItem Header="C"> <TreeViewItem Header="5" Foreground="White" /> <TreeViewItem Header="6" Foreground="White" /> </TreeViewItem> </TreeView>
我希望能把Header=1的item转移到C,这时ContextMenu就会显示转移到B或C,但是TreeView的Item是不固定的,用户可以随意新增TreeViewItem和修改TreeViewItem的Header。
这样就导致我的ContextMenu里的Item也要随着TreeViewItem数量减一变动,而且Header也要随着TreeViewItem变动。更重要的是每个TreeViewItem都拥有这个ContextMenu。。 请问这个ContextMenu如何设计?
答案
-
前面的代码仅仅只能提供一个思路,在细节方面需要根据你的具体需要进行调整。
要做到点击A时不出现A,可以通过ContextMenu的ItemContainerStyle把MenuItem的IsVisible属性多重绑定到SelectedItem和Items上进行判断。
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 MaJiXiang 2011年5月17日 8:10
全部回复
-
你好,
我写了个简单的小例子,希望能提供一些思路。
<TreeView Name="treeViewAp" Tag="TV"> <TreeView.ContextMenu> <ContextMenu ItemsSource="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Items}"> <ContextMenu.ItemTemplate> <DataTemplate> <TextBlock>转移到<TextBlock Text="{Binding Header}"/></TextBlock> </DataTemplate> </ContextMenu.ItemTemplate> <ContextMenu.ItemContainerStyle> <Style TargetType="MenuItem"> <EventSetter Event="Click" Handler="MenuItem_Click"/> <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}"/> </Style> </ContextMenu.ItemContainerStyle> </ContextMenu> </TreeView.ContextMenu> <TreeViewItem Header="A" Tag="A"> <TreeViewItem Header="1" Foreground="White" Tag="1"/> <TreeViewItem Header="2" Foreground="White" /> </TreeViewItem> <TreeViewItem Header="B" > <TreeViewItem Header="3" Foreground="White" /> <TreeViewItem Header="4" Foreground="White" /> </TreeViewItem> <TreeViewItem Header="C"> <TreeViewItem Header="5" Foreground="White" /> <TreeViewItem Header="6" Foreground="White" /> </TreeViewItem> </TreeView>
private void MenuItem_Click(object sender, RoutedEventArgs e) { MenuItem menuItem = (MenuItem)sender; TreeViewItem selectedItem = menuItem.Tag as TreeViewItem; if (selectedItem != null) { TreeViewItem targetItem = menuItem.DataContext as TreeViewItem; ItemsControl originalParent = ItemsControl.ItemsControlFromItemContainer(selectedItem); if (targetItem !=null && originalParent !=null ) { originalParent.Items.Remove(selectedItem); targetItem.Items.Add(selectedItem); } } }
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
-
前面的代码仅仅只能提供一个思路,在细节方面需要根据你的具体需要进行调整。
要做到点击A时不出现A,可以通过ContextMenu的ItemContainerStyle把MenuItem的IsVisible属性多重绑定到SelectedItem和Items上进行判断。
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 MaJiXiang 2011年5月17日 8:10