1. 程式人生 > >WPF ListBoxItem模板中新增CheckBox選中問題

WPF ListBoxItem模板中新增CheckBox選中問題

是這樣的,需要一個ListBox來展示照片,並新增一個選中的CheckBox.這就需要對ListBox的ItemTemplate的DataTemplate進行定製.新增一個Image和一個CheckBox.

大概是這樣子的.

        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid Width="250">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="200"></RowDefinition>
                            <RowDefinition Height="20"></RowDefinition>
                        </Grid.RowDefinitions>
                        <Image Grid.Row="0" Source="{Binding Photo}" Width="220"/>
                        <CheckBox Grid.Row="1" Content="命中" IsChecked="{Binding IsTarget}"></CheckBox>
                    </Grid>
                </DataTemplate>
            </Setter.Value>
        </Setter>
問題來了,當我選中CheckBox的時候,我希望ListBoxItem跳轉到當前CheckBox所在的ListBoxItem上.如何實現?

主要有下面兩種方法 :

1.

在Xaml中新增:

    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
        </Style>
    </ListBox.ItemContainerStyle>
在.cs檔案中新增
protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
    ListBoxItem item = (ListBoxItem)sender;
    item.IsSelected = true;
}
2.

在Xaml中新增:

<Style TargetType="{x:Type ListBoxItem}">
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="true">
            <Setter Property="IsSelected" Value="true" />
        </Trigger>
    </Style.Triggers>
</Style>
問題解決.

解釋:

對於方法1:

UIElement.PreviewGotKeyboardFocus 事件

在此元素聚焦於鍵盤時發生。由於此事件使用隧道路由,因此具有焦點的元素可能是子元素,而不是實際附加事件處理程式的元素。請檢查事件資料中的  以確定實際具有焦點的元素。
http://msdn.microsoft.com/zh-cn/library/system.windows.uielement.previewgotkeyboardfocus.aspx
對於方法2:

UIElement.IsKeyboardFocusWithin 屬性

獲取一個值,該值指示鍵盤焦點是否位於元素或其可視樹子元素內的任意位置。這是一個依賴項屬性。

http://msdn.microsoft.com/zh-cn/library/system.windows.uielement.iskeyboardfocuswithin(v=VS.90).aspx?ppud=4