2010-05-05 80 views
0

嗨iam使用列表框顯示項目列表。在列表框中,我每個項目都有一個togglebutton。當我點擊切換按鈕時,按鈕的狀態被按下。但是當我在列表框中滾動並再次滾動時。沒有按下togglebutton狀態。我如何防止這一點,請幫助。Wpf Listbox和Togglebutton

繼承人我的ItemTemplate

<ListBox.ItemTemplate> 
<DataTemplate> 
     <StackPanel Margin="0,3,0,0"> 
      <Border BorderBrush="Black" BorderThickness="1,1,1,1"> 
       <Border.Background> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" MappingMode="RelativeToBoundingBox"> 
         <GradientStop Color="#FFECECEC" Offset="1"/> 
         <GradientStop Color="#FFE8E8E8"/> 
         <GradientStop Color="#FFBDBDBD" Offset="0.153"/> 
         <GradientStop Color="#FFE8E8E8" Offset="0.904"/> 
        </LinearGradientBrush> 
       </Border.Background> 
       <Border.Style> 
        <Style> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}}" Value="True"> 
           <Setter Property="Border.Height" Value="100"/> 
           <Setter Property="Border.Background"> 
            <Setter.Value> 
             <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" MappingMode="RelativeToBoundingBox"> 
              <GradientStop Color="DarkGray" Offset="1"/> 
              <GradientStop Color="#FFE8E8E8"/> 
              <GradientStop Color="#FFBDBDBD" Offset="0.153"/> 
              <GradientStop Color="DarkGray" Offset="0.904"/> 
             </LinearGradientBrush> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </Border.Style> 
       <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="500"/> 
          <ColumnDefinition Width="100"/> 
          <ColumnDefinition Width="55"/> 
         </Grid.ColumnDefinitions> 

         <!--Pick number--> 
         <StackPanel Grid.Column="0" VerticalAlignment="Center" Orientation="Vertical"> 
          <TextBlock Text="{Binding Path=FtgNamn}" FontWeight="Bold" FontSize="22pt" FontFamily="Calibri"/> 
          <TextBlock Text="{Binding Path=LevsAttBeskr}" FontSize="18pt" FontFamily="Calibri"/> 
         </StackPanel> 

         <!--Pick Quantity--> 
         <StackPanel Grid.Column="1" VerticalAlignment="Center"> 
          <TextBlock Text="{Binding Path=Antal}" FontSize="44pt" FontFamily="Calibri"/> 
         </StackPanel> 

         <!-- Checkbox--> 
         <StackPanel Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center"> 
          <ToggleButton Name="Check" Width="40" Height="40" Click="Check_Click" Tag="{Binding Path=Plocklista}"> 
           <ToggleButton.Style> 
            <Style TargetType="ToggleButton"> 
             <Setter Property="Template"> 
              <Setter.Value> 
               <ControlTemplate TargetType="{x:Type ToggleButton}"> 
                <Border x:Name="InnerBorder" Background="White" BorderBrush="Black" BorderThickness="1"/> 
                <ControlTemplate.Triggers> 
                 <Trigger Property="IsChecked" Value="True"> 
                  <Setter TargetName="InnerBorder" Property="Background"> 
                   <Setter.Value> 
                    <ImageBrush ImageSource="/Images/button_ok.png"/> 
                   </Setter.Value> 
                  </Setter> 
                  <Setter TargetName="InnerBorder" Property="BorderThickness" Value="0"/> 
                 </Trigger> 
                </ControlTemplate.Triggers> 
               </ControlTemplate> 
              </Setter.Value> 
             </Setter> 
            </Style> 
           </ToggleButton.Style> 
          </ToggleButton> 
         </StackPanel> 

        </Grid> 

        <Border BorderBrush="Darkgray" BorderThickness="0,0,1,0"> 

        </Border> 
        <TextBlock Width="100" Text="{Binding Path=Quantity}" FontSize="44pt" FontFamily="Calibri"/> 
        <CheckBox Width="78"/> 
       </StackPanel> 
      </Border> 
     </StackPanel> 

</DataTemplate> 

繼承人的綁定代碼

 delegate void FillPickHeaderDelegate(PickHeaderDoc[] pickHeaderDocs); 
    private void FillPickList(PickHeaderDoc[] pickHeaderDoc) { 
     if(lbAllPickAssignments.Dispatcher.CheckAccess()) { 
      lbAllPickAssignments.ItemsSource = pickHeaderDoc; 
      lbAllPickAssignments.UnselectAll(); 
     } else { 
      lbAllPickAssignments.Dispatcher.Invoke(new FillPickHeaderDelegate(FillPickList), new object[] { pickHeaderDoc }); 
     } 
    } 

而且繼承人的Click事件

 private void Check_Click(object sender, RoutedEventArgs e) { 
     ToggleButton btn = (ToggleButton) sender; 

     if(btn.IsChecked.Value == true) { 
      m_checkedList.Add(Convert.ToInt32(btn.Tag)); 
     } else { 
      m_checkedList.Remove(Convert.ToInt32(btn.Tag)); 
     } 

     txtblockPickCount.Text = m_checkedList.Count.ToString(); 
    } 
+0

可能要編輯代碼的佈局(在VS按Shift + Tab選擇所有上面的文字時,它縮進以下) – 2010-05-05 09:13:23

+0

你面對所有這些CONTROLTEMPLATES和風格刪除同樣的問題? – Amsakanna 2010-05-05 09:53:04

+0

只有當我選擇一個項目,然後向下移動到列表的底部然後重新爬起來時纔會發生。 – Tan 2010-05-05 10:05:41

回答

0

是真正得到更新的對象的值該ToggleButton被綁定到? WPF中的ListView使用稱爲虛擬化的東西來僅繪製可見的列表框部分。這意味着,當您的ToggleButton超出範圍時,它會在重新進入範圍時重繪(並重新計算)。

我認爲問題在於,要麼切換按鈕有點擊的方法,或綁定。你能發表更多關於它的細節嗎?

+0

我已使用新的代碼更新, – Tan 2010-05-05 11:16:48

+0

什麼是Plocklista? – 2010-05-05 11:50:53

+0

這是一個int。但我現在解決了這個問題。無論如何,謝謝 我錯過了一個具有約束力的行爲。 – Tan 2010-05-05 12:03:07