在Silverlight&amp ;;中的ItemsControl模板中寻址单个对象。 C#

时间:2011-09-21 10:24:40

标签: c# silverlight

我有一个带有ItemsControl的silverlight应用程序,它显示了一个包含值和单位的项目列表...

Some DataType       1.8 XY
Datatype2          15.6 Units
Other Datatype      1.8 XTZ

我遇到的问题是单位是自定义的,因此我无法提前知道它们将持续多久,我需要它们如图所示排列。因此,在运行中,我想要解决每个单元文本块,找到宽度最大的文本块并将其余部分设置为相同(或将列设置为该宽度)。

如何在C#中单独处理items控件中生成的每个文本块?

到目前为止,这是xaml

            <ItemsControl Name="DataTypesGrid" ItemsSource="{Binding}" Margin="0" BorderBrush="{x:Null}" Foreground="White" Background="{x:Null}" IsEnabled="True">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Vertical" Margin="0,2,0,0" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid Width="Auto">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                    <ColumnDefinition Width="*"></ColumnDefinition>
                                    <ColumnDefinition Width="20"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                                <TextBlock Text="{Binding Name}" HorizontalAlignment="Left" Grid.Column="0" FontSize="15" />
                                <TextBlock Text="{Binding Value}" HorizontalAlignment="Right" Margin="0,0,4,0" FontSize="15" Grid.Column="1" />
                                <TextBlock Text="{Binding Unit}" HorizontalAlignment="Left" FontSize="15" Grid.Column="2" />
                        </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

首先从here获取VisualTreeEnumeration扩展方法的代码。

现在在数据模板Name中为您的单位TextBlock添加Name="unitText"属性。

如果存在VisualTreeEnumeration扩展方法,您现在可以为这些框创建“查询”: -

 IEnumerable<TextBlock> unitBlocks = DataTypesGrid.Descendents()
                                  .OfType<TextBlock>()
                                  .Where(t => t.Name == "unitText");

只要unitBlocks存在,您就可以继续DataTypesGrid。在其上使用For Each将返回ItemsControl的最新内容。如果您需要临时创建.ToList()

,可以在其上使用List<TextBlock>