【问题标题】:Find child elements in a WPF ListView ItemTemplate在 WPF ListView ItemTemplate 中查找子元素
【发布时间】:2009-12-20 16:33:48
【问题描述】:

给定一个已填充的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>

【问题讨论】:

    标签: c# wpf xaml listview datatemplate


    【解决方案1】:

    首先,除非您确实需要,否则请避免这样做。如果您绝对必须,您可以使用DataTemplate.FindName,其中模板化的父级是由ListView 生成的ListViewItem。要获取ListViewItem,请使用ListViewItemContainerGenerator

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

    【讨论】:

    • 嗨!我在 wpf 中很新。我想知道不这样做的原因是什么。因为我也有类似的问题。我有一个列表视图,其中包含项目和组合框。列表视图外的按钮将所选值保存在组合框中。
    • @Kent Boogaart 很好的信息,但只是说“不要这样做”并没有太大帮助。原因不在您链接到的 MSDN 文档中,所以每个人都想知道您知道什么,但我们不知道什么。
    • 另外,根据问题中链接的文档,您实际上使用 ContentPresenter 作为 FindName() 中的 templatedParent 参数。使用 ListeViewItem 会导致异常。
    【解决方案2】:

    很简单 就这样做

        <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是cavas

    【讨论】:

      【解决方案3】:

      您可以尝试使用 LogicalTreeHelperVisualTreeHelper 来查询对象的子对象,但如果您将组合框绑定到列表视图显示的项目,则不必担心“获取' 完全没有。

      然后你可以看看你的项目。

      每当您发现自己在视觉或逻辑树中寻找存在于您的 ui 中的元素,以便获得它们的值时,问问自己“我在这里缺少什么”“为什么不是我的业务(或视图模型)当用户与 ui 交互时使用相关数据进行更新?'

      对于上面的示例,我将构建一个具有两个属性的视图模型,一个 String(用于您的标签)和一个 SelectedItem(您可以将您的组合框选定项绑定到)。它更容易,更健壮,它使您不必在视觉元素中拖网。 xaml/wpf 的美妙之处之一是它将您的逻辑与您的视图分开。你的建议会打破这个模型。你会将视图与你的逻辑纠缠在一起,然后它就会变得混乱......

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 2016-09-20
        • 2019-11-05
        • 1970-01-01
        相关资源
        最近更新 更多