在我的应用程序中,我使用列表框实现了一个数据透视表。在选择列表框项目时,将导航到另一个页面。同样在同一个列表框项目中,我实现了用于删除所选列表项的上下文菜单。有些情况下它完美无缺。在这里我的问题是,在某些情况下,在保持列表框项目时,上下文菜单出现并显示删除选项。然后它导航到另一个页面,上下文菜单弹出窗口永远不会隐藏。任何人请帮我解决这个问题。
这里我附上了我的代码段: -
<DataTemplate x:Key="GroupLoadedTemplate">
<Grid Height="120" Width="480" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Height="105" Width="110" BorderBrush="White" Grid.Column="0" BorderThickness="2">
<Image delay:LowProfileImageLoader.UriSource="{Binding Path=Avatar}" Source="/Image/default-thumb-groups.png"/>
</Border>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="4"/>
<RowDefinition Height="35"/>
<RowDefinition Height="50"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Name,Mode=TwoWay}" Grid.Column="1" Grid.Row="1" FontFamily="Segoe WP Light" FontSize="30" Foreground="{StaticResource PhoneForegroundBrush}" TextWrapping="Wrap"/>
<TextBlock Text="{Binding Path=Members,Mode=TwoWay}" Grid.Column="2" Grid.Row="2" FontFamily="Segoe WP Light" HorizontalAlignment="Left" FontSize="20" Opacity="0.91" Foreground="{StaticResource PhoneForegroundBrush}" TextWrapping="Wrap"/>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Name="DeleteGroup" Tag="{Binding Nid,Mode=TwoWay}" Visibility="{Binding ElementName=GroupList, Path=DataContext.DeleteStatus,Mode=TwoWay, Converter={StaticResource booleanToVisibility}}" IsZoomEnabled="False">
<toolkit:MenuItem Header="delete group">
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="Click">
<Command:EventToCommand Command="{Binding ElementName=GroupList, Path=DataContext.DeleteCommand,Mode=TwoWay}" CommandParameter="{Binding ElementName=DeleteGroup}" PassEventArgsToCommand="True"/>
</Interactivity:EventTrigger>
</Interactivity:Interaction.Triggers>
</toolkit:MenuItem>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</Grid>
</Grid>
</DataTemplate>
答案 0 :(得分:1)
不幸的是,您的代码段无法轻松重新创建代码,因为它绑定到您尚未指定的对象。
您是否有理由不将ContextMenu应用于整个ListBoxItem?这样做的时候我没有看到任何问题。
我假设您在SelectionChanged上导航。您可能希望添加Tap
手势(来自工具包)并改为导航。
我假设问题是在开始显示contextmenu时设置/更改选择。
答案 1 :(得分:0)
我有一个可能的解决方案。
自定义ItemContainerStyle添加StackLayout或Grid或ContentControl周围的内容。然后修改现有状态以显示或隐藏您的复选框(如果需要)。添加一个属性以绑定未与数据一起存储的复选框,并将{Binding YourNewProperty}绑定到复选框XAML。
现在,您可以通过datacontext控制和读取所选的复选框。
<CheckBox Content="CheckBox" Margin="0,0,50,0" VerticalAlignment="Top" d:LayoutOverrides="Width" IsChecked="{Binding YourNewProperty}"/>
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}"/>
您还可以在列表框项的循环中使用以下内容直接访问复选框。我认为使用Binding技术很简单。
foreach (var loopItem in listBox1.Items)
{
ListBoxItem itemToCheck = listBox1.ItemContainerGenerator.ContainerFromItem(loopItem) as ListBoxItem;
// code to find the check box control
// find a ContentPresenter of that list item.. [Call FindVisualChild Method]
ContentPresenter ContentPresenterObj = FindVisualChild<ContentPresenter>(itemToCheck);
// call FindName on the DataTemplate of that ContentPresenter
DataTemplate DataTemplateObj = ContentPresenterObj.ContentTemplate;
CheckBox Chk = (CheckBox)DataTemplateObj.FindName("ChkList", ContentPresenterObj);
// get a selected checkbox items.
if (Chk.IsChecked == true)
{
MessageBox.Show(Chk.Content.ToString().Trim());
}
}