我正在开发一个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>
当我选中/选中复选框时,复选框选中的事件将触发,当我取消选中/取消选中复选框时,复选框将取消选中该事件。
但现在我的问题是:
当我滚动列表框时,选中了复选框并且未选中的事件会自动触发?
我怎样才能避免这种情况发生?
答案 0 :(得分:1)
您的问题与您绑定IsChecked
属性并拥有Checked
和Unchecked
事件处理程序的事实有关。更新绑定并更改属性时,将导致事件触发。
设置/加载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>