Найти дочерние элементы в WPF ListView ItemTemplate - PullRequest
1 голос
/ 20 декабря 2009

Учитывая заполненный ListView, как мне пройти через каждый связанный шаблон и извлечь выделенный ComboBox (или любой другой элемент управления, содержащийся в DataTemplate)?

<ListView x:Name="lstCommands">
<ListView.ItemTemplate>
    <DataTemplate>
        <Grid x:Name="gridInputs">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Label Content="{Binding Path=Key}"/>
            <ComboBox x:Name="cbInputCmd" Grid.Column="1" ItemsSource="{Binding Source={StaticResource inputData}}" Tag="{Binding Path=Key}"/>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

Ответы [ 3 ]

3 голосов
/ 20 декабря 2009

Во-первых, избегайте этого, если вам действительно не нужно. Если вам абсолютно необходимо, вы можете использовать DataTemplate.FindName, где шаблонным родителем является ListViewItem, сгенерированный ListView. Чтобы получить ListViewItem, используйте ListView 's ItemContainerGenerator.

Обновление: причина, по которой я предлагаю избегать такого подхода, где это возможно, заключается в том, что он создает более тесно связанный, хрупкий код. ОП не упомянул, почему он хотел сделать то, что он просил, но я подозреваю, что он мог достичь своей цели более идиоматическими средствами, такими как привязки.

1 голос
/ 21 марта 2014

просто просто сделай это

    <ListViewItem Name="mainiterm" Style="{ StaticResource inboxlst}" Selected="ListViewItem_Selected_1">
            <Canvas Style="{StaticResource inboxcanvas}">
                    <Label Name="namelabel"  Content="lalallala1" Style="{StaticResource inboxlabel1}" />
                <Label  Content="lalallala" Style="{StaticResource inboxlabel2}"/>
              </Canvas>
        </ListViewItem>

и VB

 Dim r = mlistview.Items.GetItemAt(i)
    Dim textYear As Label = Nothing
    Dim s As Canvas = r.Content
    Dim a As Label = s.Children.Item(1)
    a.Content = "Disconnected"

a является этикеткой, s - кавой

0 голосов
/ 21 декабря 2009

вы можете попробовать использовать LogicalTreeHelper или VisualTreeHelper, который позволяет запрашивать объект для его дочерних элементов, но если вы связываете свои комбинированные списки с элементом, который отображается в списке, вам не нужно было бы беспокоиться о получении 'их вообще.

Тогда вы можете просто взглянуть на свой предмет.

Каждый раз, когда вы обнаруживаете, что идете по визуальному или логическому дереву, ища элементы, которые существуют в вашем пользовательском интерфейсе, чтобы вы могли получить их значения, спросите себя: «Что мне здесь не хватает»? обновляется соответствующими данными, когда пользователь взаимодействует с пользовательским интерфейсом? '

Для приведенного выше примера я бы построил модель представления, которая имела бы два свойства: String (для вашей метки) и SelectedItem (с которыми вы могли бы связать выбранный элемент комбинированного списка). это проще, надежнее, и вам больше не придется рыться в визуальных элементах. одна из замечательных особенностей xaml / wpf заключается в том, что он отделяет вашу логику от вашего взгляда. то, что вы предлагаете, сломает эту модель. Вы запутаете вид своей логикой, и оттуда он станет грязным ...

...