Windows phone 7 在windows phone 8应用程序中滚动列表框时触发复选框选中和未选中事件?

Windows phone 7 在windows phone 8应用程序中滚动列表框时触发复选框选中和未选中事件?,windows-phone-7,xaml,windows-phone-8,windows-phone,checkedlistbox,Windows Phone 7,Xaml,Windows Phone 8,Windows Phone,Checkedlistbox,我正在开发一个WindowsPhone8应用程序,其中我使用列表框中的复选框以及一些文本块 <ListBox x:Name="lstStudentSelect" ItemContainerStyle="{StaticResource ListBoxItemStyle1}" Background="Transparent" ScrollViewer.VerticalScrollBarVisibility="Visible

我正在开发一个WindowsPhone8应用程序,其中我使用列表框中的复选框以及一些文本块

<ListBox x:Name="lstStudentSelect"  ItemContainerStyle="{StaticResource ListBoxItemStyle1}" Background="Transparent" ScrollViewer.VerticalScrollBarVisibility="Visible" Height="487" BorderThickness="0"  VerticalAlignment="Top" Margin="8,198,10,0">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel   Orientation="Horizontal">
                <StackPanel Width="360" Orientation="Horizontal" HorizontalAlignment="Left">
                    <TextBlock Text="{Binding stunum}" Width="80"   Foreground="Black"  TextWrapping="Wrap"  FontSize="20" VerticalAlignment="Center" />
                    <TextBlock  Text="{Binding name}" Width="280"  Foreground="Black"  TextWrapping="Wrap"  FontSize="20" VerticalAlignment="Center" />
                </StackPanel>
                <StackPanel Width="5"></StackPanel>
                <StackPanel Width="150" Orientation="Horizontal" HorizontalAlignment="Right">
                    <CheckBox  IsChecked="{Binding ChkFlag, Mode=TwoWay}"  BorderBrush="#203485" Foreground="Black" BorderThickness="1" Tag="{Binding cusnum}" Name="cusCheck" Checked="cusCheck_Checked_2" Unchecked="cusCheck_Unchecked_2" ></CheckBox>
                    <TextBlock Text=" "  TextWrapping="Wrap" Foreground="Black" FontSize="20" VerticalAlignment="Center" />
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

当我选中/取消选中复选框时,复选框已选中事件将激发,当我取消选中/取消选中复选框时,复选框未选中事件将激发

但现在我的问题是:

当我滚动列表框时,复选框已选中和未选中的事件会自动触发吗


如何避免这种情况发生?

您的问题与绑定
IsChecked
属性以及选中
未选中事件的处理程序有关。当绑定更新且属性更改时,这将导致触发事件

设置/加载
ItemsSource
时,将为每个项目激发事件

默认情况下,
ListBox
为其项目面板使用虚拟化容器。这意味着,当您滚动时,项目将加载到容器中或从容器中取出,这也将触发绑定更改导致的事件。这就是为什么在滚动时会看到更多事件被触发。(假设您有足够大的列表需要虚拟化。)

假设
ChkFlag
是ViewModel上的一个属性,
cusCheck\u Checked\u 2
&
cusCheck\u Unchecked\u 2
是视图上的事件处理程序,您可以通过将逻辑从事件处理程序移动到
ChkFlag
的setter中来简化事情并避免此问题。(这也可能提高易测试性。)

例如,您可以拥有如下属性:

    public bool ChkFlag
    {
        get
        {
            return this.chkFlagField;
        }

        set
        {
            if (this.chkFlagField != value)
            {
                this.chkFlagField = value;
                this.RaisePropertyChanged();

                if (value)
                {
                    // perform checked action
                }
                else
                {
                    // perform unchecked action
                }
            }
        }
    }

另一种解决方案是将StackPanel设置为Panel

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

我刚刚遇到了同样的问题。为我解决。