1. 程式人生 > >【WPF】ListBox使用DataTemplate 以及預設選中第一項Item

【WPF】ListBox使用DataTemplate 以及預設選中第一項Item

ListBox中DataTemplate的用法如下 。

<ListBox x:Name="areaLB" ItemsSource="{Binding AreaNumList}" SelectedItem="{Binding SelectedItem}" BorderThickness="0" Background="White">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <RadioButton x:Name="radioBtn" FontSize="14" GroupName
="area" Style="{StaticResource myRadioButton2}">
<RadioButton.IsChecked> <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType=ListBoxItem}" Mode="TwoWay" /> </RadioButton.IsChecked> <RadioButton.Content
>
<Binding Path="Content" RelativeSource="{RelativeSource AncestorType=ListBoxItem}" Mode="TwoWay" /> </RadioButton.Content> </RadioButton> </DataTemplate> </ListBox.ItemTemplate> </ListBox>

需求:初始化時,使ListBox預設選中第一項。(否則將沒有任一項被選中)

過程:由於ListBox使用了DataTemplate,一直是想辦法如何去訪問/獲取到ListBox中的第一項,然後設定該項

RadioButton.isChecked = true

搜到不少類似下面這種方法的,如何從控制元件中遞迴找到子控制元件,都沒法解決問題:

private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

最後才發現,直接把ListBox控制元件的選中項設為第一項即可!其實就是這麼簡單!!

listBox1.SelectedIndex = 0;

重要的參考: