在Windows Phone 8应用程序中滚动列表框时,CheckBox Checked和Unchecked事件是否会触发?

时间:2013-07-18 06:10:51

标签: windows-phone-7 xaml windows-phone-8 windows-phone checkedlistbox

我正在开发一个Windows Phone 8应用程序,其中我在列表框中使用了一个复选框以及一些文本块。

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

当我选中/选中复选框时,复选框选中的事件将触发,当我取消选中/取消选中复选框时,复选框将取消选中该事件。

但现在我的问题是

当我滚动列表框时,选中了复选框并且未选中的事件会自动触发?

我怎样才能避免这种情况发生?

2 个答案:

答案 0 :(得分:1)

您的问题与您绑定IsChecked属性并拥有CheckedUnchecked事件处理程序的事实有关。更新绑定并更改属性时,将导致事件触发。

设置/加载ItemsSource时,每个项目都会触发事件。

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

假设ChkFlag是ViewModel上的属性,cusCheck_Checked_2&amp; cusCheck_Unchecked_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
                }
            }
        }
    }

答案 1 :(得分:0)

可以将StackPanel设置为Panel。

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