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