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> 
相關問題