2010-01-21 2 views
0

CSLA Bindable List에 바인딩 된 TextBox을 포함하는 간단한 ListBox.ItemTemplate이 있습니다. TextBox을 선택하면 CurrentItem은 변경되지 않으며 Label을 선택하면 변경됩니다. 나는 IsSynchronizedWithCurrentItem='True'입니다.Wpf ItemTemplate CurrentItem

<ListBox x:Name="ItemsDataGrid" 
     ItemsSource="{Binding Source={StaticResource AuditItems},Path=Items}" 
     IsSynchronizedWithCurrentItem="True"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="200"></ColumnDefinition> 
        <ColumnDefinition Width="100"></ColumnDefinition> 
       </Grid.ColumnDefinitions>   
       <Label Grid.Column="0" 
         Content="{Binding Path=TypeRef}" />      
         <TextBox x:Name="TextBoxQty" 
           Grid.Column="1" 
           Text="{Binding Path=TaliQty}"/>       
      </Grid> 
     </DataTemplate>         
    </ListBox.ItemTemplate>       
</ListBox> 

답변

2

시도는 목록 상자이 추가. TextBox와 같은 포함 된 요소가 키보드 포커스를 가져올 때마다 항목을 선택합니다. 유사한 메서드를 방아쇠에있는 간단한 설정자와 함께 사용할 수도 있지만 ICollectionView의 CurrentItem 설정을 방해하는 경향이 있습니다.

  <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Style.Triggers> 
        <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
         <Trigger.EnterActions> 
          <BeginStoryboard x:Name="SetSelected"> 
           <Storyboard> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected"> 
             <DiscreteBooleanKeyFrame KeyTime="0:00" Value="True" /> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
         <Trigger.ExitActions> 
          <RemoveStoryboard BeginStoryboardName="SetSelected"/> 
         </Trigger.ExitActions> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.ItemContainerStyle> 
+0

우수하고 잘 생각했습니다! –

0

이 현상은 TextBox가 MouseDown 이벤트를 처리하기 때문에 발생합니다. bubble up으로 설정되었으므로 포함 된 ListBoxItem에 도달하지 않습니다. 이 문제를 해결하는 가장 간단한 방법은 PreviewMouseDown에서 ListBoxItems의 선택을 처리하는 것입니다. 그러면 실제 MouseDown 이벤트가 터지기 전에 터널을 아래로 내립니다.

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <EventSetter Event="PreviewMouseDown" 
        Handler="ListBoxItem_PreviewMouseDown" /> 
    </Style> 
</ListBox.ItemContainerStyle> 

그리고 XAML 파일 뒤에 코드에서

:

private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var item = (sender as ListBoxItem); 
    if (item != null) 
     item.IsSelected = true; 
} 
+0

완벽한 감사의 말로 거품에 대해 잊어 버렸습니다! –

관련 문제