Windows phone 7 在windows phone 8应用程序中滚动列表框时触发复选框选中和未选中事件?
我正在开发一个WindowsPhone8应用程序,其中我使用列表框中的复选框以及一些文本块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
<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>
我刚刚遇到了同样的问题。为我解决。