2010-05-05 4 views
0

안녕하세요, 목록 상자를 사용하여 항목 목록을 표시합니다. 목록 상자에 모든 항목에 대한 토글 버튼이 있습니다. 토글 버튼을 클릭하면 토글 버튼의 ​​상태가 눌러집니다. 그러나 내가 목록 상자에서 아래로 스크롤하고 다시 scolls 때. 토글 버튼 상태가 눌러지지 않습니다. 이걸 어떻게 막을 수 있습니까?Wpf 목록 상자 및 토글 버튼

Heres는 내 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> 

을 Heres 바인딩 코드

 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 }); 
     } 
    } 

그리고 heres는 클릭 이벤트

 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

위의 텍스트를 모두 들여 쓰기 할 때 Shift + Tab을 사용하여 코드의 레이아웃을 편집하고 싶을 수도 있습니다. –

+0

모든 컨트롤 템플릿과 스타일에서 동일한 문제가 발생합니까? – Amsakanna

+0

iam이 항목을 선택한 다음 목록의 맨 아래로 내려 가서 다시 scolls 할 때만 발생합니다. – Tan

답변

0

실제로 객체에 업데이트 값입니다ToggleButton이 바운드되고 있는지? WPF의 ListView는 가상화라고하는 것을 사용하여 목록 상자의 일부만 표시합니다. 즉, ToggleButton이 범위를 벗어나면 범위로 돌아올 때 다시 그려지고 다시 계산됩니다.

문제는 ToggleButton에있는 click 메소드 또는 바인딩에 있다고 생각합니다. 그것에 대한 자세한 내용을 게시 할 수 있습니까?

+0

지금 새 코드로 업데이트했습니다. – Tan

+0

Plocklista 란 무엇입니까? –

+0

int입니다. 그러나 나는 지금 문제를 해결했다. 어쨌든 고마워, 바인딩 propery보고 싶었어. – Tan