2010-01-21 60 views
0

我有一個簡單的ListBox.ItemTemplate包含LabelTextBox綁定到CSLA Bindable List。當我選擇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

非常好,經過深思熟慮! – 2010-01-23 12:49:55

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

完美的謝謝你,忘了所有關於泡沫的事! – 2010-01-23 12:48:38

相關問題