多选问题wp7列表框

时间:2011-05-05 05:17:55

标签: windows-phone-7

在我的应用程序中,我使用列表框实现了一个数据透视表。在选择列表框项目时,将导航到另一个页面。同样在同一个列表框项目中,我实现了用于删除所选列表项的上下文菜单。有些情况下它完美无缺。在这里我的问题是,在某些情况下,在保持列表框项目时,上下文菜单出现并显示删除选项。然后它导航到另一个页面,上下文菜单弹出窗口永远不会隐藏。任何人请帮我解决这个问题。

这里我附上了我的代码段: -

    <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>

2 个答案:

答案 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()); 
                }
 }