在WPF ListView ItemTemplate中查找子元素

时间:2009-12-20 16:33:49

标签: c# wpf xaml listview datatemplate

给定填充的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 个答案:

答案 0 :(得分:3)

首先,除非你真的需要,否则不要这样做。如果您绝对必须,则可以使用DataTemplate.FindName,其中模板化父级是ListViewItem生成的ListView。要获取ListViewItem,请使用ListView的{​​{1}}。

更新:我建议尽可能避免使用此方法的原因是因为它会创建更紧密耦合的脆弱代码。 OP没有提到为什么他想做他所要求的事情,但我怀疑他可以通过更具惯用性的手段来实现他的目标,例如绑定。

答案 1 :(得分:1)

很简单 就这样做

    <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是卡瓦斯

答案 2 :(得分:0)

您可以尝试使用LogicalTreeHelperVisualTreeHelper来查询对象的子项,但如果您将组合框绑定到列表视图显示的项目,则不必担心“得到”它们。

然后你可以看看你的物品。

任何时候你发现自己走在视觉或逻辑树中寻找你的ui中存在的元素,这样你就可以得到他们的价值观,问问自己'我在这里缺少什么''为什么不是我的事业(或视图模型)当用户与ui?'

交互时,使用相关数据进行更新

对于上面的示例,我将构建一个具有两个属性的视图模型,一个String(用于标签)和一个SelectedItem(您可以将组合框选定项绑定到)。它更容易,更强大,它可以阻止你浏览视觉元素。关于xaml / wpf的一个美妙的事情是它从你的角度分离你的逻辑。你的建议将打破这个模型。你会用你的逻辑纠缠视图,从那里就会变得混乱......