1

我正在开发一个Windows Phone 8应用程序,其中我正在使用列表框中的复选框以及一些文本块。CheckBox Checked和Unchecked事件在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> 
当我检查/上的复选框选中复选框事件触发选择

,当我取消/取消选择复选框取消选中复选框事件触发。

但现在我的问题是

当我滚动复选框选中列表框和unchecked事件触发自动?

我该如何避免这种情况发生?

回答

1

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

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

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

假设ChkFlag是您的视图模型的属性和cusCheck_Checked_2 & cusCheck_Unchecked_2对你的看法事件处理程序,你可以做的事情为自己简单,通过移动来避免此问题从事件处理程序到ChkFlag的设置程序的逻辑。 (这可能也提高了可测性方便的了。)

例如,你可以有这样的特性:

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

另一种解决方案可以设置一个StackPanel作为面板。

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel/> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 
相关问题