WPF-VB访问列表框中的控件

WPF-VB访问列表框中的控件,wpf,vb.net,Wpf,Vb.net,我知道有很多像这样的帖子,但我已经搜索了好几天,似乎没有一个能为我找到正确的答案。我有一个包含数据集结果的数据绑定列表框。其中一个结果是一个十进制百分比,我希望用它来填充每行一个条形图。我决定最简单的方法肯定是使用矩形控件,并使用数据绑定值来控制其宽度属性。。。简单 但是,我真的很难从列表框项中访问矩形控件。以下是我的WPF示例: <ListBox x:Name="lbResults" HorizontalContentAlignment="Stretch" ItemsSource="{B

我知道有很多像这样的帖子,但我已经搜索了好几天,似乎没有一个能为我找到正确的答案。我有一个包含数据集结果的数据绑定列表框。其中一个结果是一个十进制百分比,我希望用它来填充每行一个条形图。我决定最简单的方法肯定是使用矩形控件,并使用数据绑定值来控制其宽度属性。。。简单

但是,我真的很难从列表框项中访问矩形控件。以下是我的WPF示例:

<ListBox x:Name="lbResults" HorizontalContentAlignment="Stretch" ItemsSource="{Binding}" HorizontalAlignment="Left" Height="578" Margin="10,64,0,0" VerticalAlignment="Top" Width="754">
            <ListBox.ItemTemplate>
                <DataTemplate>

                    <Border BorderBrush="#FFDEDFFF" Margin="3" Padding="1" BorderThickness="2" CornerRadius="3" Background="#FFF8F8FD" >

                        <StackPanel Orientation="Horizontal">


                            <Border BorderBrush="#FFE2E3FF" Width="200" Margin="3" Padding="1" BorderThickness="2" CornerRadius="3" Background="#FFF3F4FF" >

                                <StackPanel Orientation="Vertical">

                                    <Label Content="{Binding FULLNAME}" FontWeight="Bold" Padding="1"/>

                                    <Label Name="lblPot" Padding="1">
                                        <Label.Content>
                                            <Binding Path="POT"/>
                                        </Label.Content>
                                        <Label.ContentStringFormat>
                                            Pot: {0}
                                        </Label.ContentStringFormat>
                                    </Label>

                                    <Label Padding="1">
                                        <Label.Content>
                                            <Binding Path="POTSTATUS"/>
                                        </Label.Content>
                                        <Label.ContentStringFormat>
                                            Status: {0}
                                        </Label.ContentStringFormat>
                                    </Label>

                                    <Label Padding="1">
                                        <Label.Content>
                                            <Binding Path="DAYSTODAY"/>
                                        </Label.Content>
                                        <Label.ContentStringFormat>
                                            Days: {0}
                                        </Label.ContentStringFormat>
                                    </Label>


                                </StackPanel>

                            </Border>

                            <Border BorderBrush="#FFE2E3FF" Width="295" Margin="3" Padding="5" BorderThickness="2" CornerRadius="3" Background="#FFF3F4FF" >

                                <StackPanel Name="spProgress" Orientation="Vertical">

                                    <Label Content="{Binding Complete}" Padding="1"/>


                                    <Border BorderBrush="#FFE2E3FF"  BorderThickness="1" CornerRadius="5" Height="30" Width="280">

                                        <Rectangle Name="rctProgSuccess" HorizontalAlignment="Left" Height="28" Stroke="{x:Null}" VerticalAlignment="Top" Width="280">
                                            <Rectangle.Fill>
                                                <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                                                    <GradientStop Color="White" Offset="0"/>
                                                    <GradientStop Color="#FF54EE62" Offset="1"/>
                                                </LinearGradientBrush>
                                            </Rectangle.Fill>
                                        </Rectangle>

                                    </Border>

                                </StackPanel>

                            </Border>


                        </StackPanel>

                    </Border>

                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
具有以下功能:

私有函数FindVisualChildOf childItem作为DependencyObjectobj作为DependencyObject作为childItem

For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(obj) - 1

    Dim child As DependencyObject = VisualTreeHelper.GetChild(obj, i)

    If child IsNot Nothing AndAlso TypeOf child Is childItem Then
        Return DirectCast(child, childItem)
    Else

        Dim childOfChild As childItem = FindVisualChild(Of childItem)(child)
        If childOfChild IsNot Nothing Then
            Return childOfChild
        End If

    End If

Next

Return Nothing
端函数

但是,声明的myListBoxItem始终填充为空。我确信我在这里遗漏了一些基本的东西,但我真的很高兴听到任何反馈——即使有一种完全不同的方式来实现我正在做的事情。。。使用数据网格或任何东西


非常感谢

如果我正确理解了你的问题,这样的方法应该行得通。第一:处理矩形上加载的事件:

<Rectangle Loaded="rctProgSuccess_Loaded" Name="rctProgSuccess" HorizontalAlignment="Left" Height="28" Stroke="{x:Null}" VerticalAlignment="Top" Width="280">
    ...
</Rectangle>

那太棒了!!第一个障碍很好地克服了!非常感谢。仅仅是从一个不同的角度来看,现在很明显,这已经造成了不同!事实上-我做得很好-再次感谢你。。。我在XAML中为矩形设置了Datacontext作为驱动百分比的值,例如0.75为75%,并将其乘以现有宽度。。。这给了我确切的结果,我需要。。。但是,我现在需要做另一个与此相同的图表,但是我需要数据集中的两个值来进行此计算。我想我在这里遗漏了一些你逃避的类,但是我不知道如何将这些额外的数据放到加载事件的上下文中。。。如果您能提供进一步的建议,我将不胜感激!!:我不确定我是否理解正确,可能会在必要时提出一个包含更多细节的新问题,但如果您需要数据集中其他地方的数据,即:不在数据集中的其他项目中,我认为最好的方法是通过查询您的数据集直接访问数据集,而不是尝试从列表框项目中提取数据,这是一个有点倒退的方法,谢谢你的回复!是的,可能不太清楚,但我现在做的是传递ListBox项的整个数据行,而不是单个有界值。我已经设法通过bounded DataContext传入了整个DataRowView,现在可以使用dataset行中的其他值来计算其他矩形。。。我敢肯定,这样的反应就更没有意义了。。。不过还是要谢谢你,因为你最初的回复让我对这一切都很满意
<Rectangle Loaded="rctProgSuccess_Loaded" Name="rctProgSuccess" HorizontalAlignment="Left" Height="28" Stroke="{x:Null}" VerticalAlignment="Top" Width="280">
    ...
</Rectangle>
Private Sub rctProgSuccess_Loaded(sender As Object, e As RoutedEventArgs)
    Dim rctProgSuccess As Rectangle = DirectCast(sender, Rectangle)

    'Obviously edit the following part to match the type of data of the items that populate your ListBox
    Dim yourItem As YourClass = DirectCast(rctProgSuccess.DataContext, YourClass)
    rctProgSuccess.Width = yourItem.yourPercentage 'or whatever
End Sub