WPF中具有不同元素类型的列表布局

时间:2013-04-01 13:24:32

标签: c# wpf

我需要修复包含不同类型元素的列表。每种类型都有自己的数据类型来表示每种类型的viewmodel。以下代码适用于我,但由于某种原因,内部数据被截断,达到某个值(看起来像默认值)。我需要删除这个转换。

这就是我所拥有的。此代码位于控件中,也可以放在列表中(可以加倍或三倍)。但我不认为这是相关的。

<ScrollViewer VerticalScrollBarVisibility="Visible">
            <ListView DockPanel.Dock="Top" Name="testCaseResultListView" 
                      ItemsSource="{Binding LogItems}" 
                      ItemContainerStyleSelector="{StaticResource fixSideViewLogItemStyleSelector}"
                      SelectionMode="Single"
                      >
            <ListView.View>
                <GridView x:Name="gridView2">
                    <GridView.ColumnHeaderContainerStyle>
                        <Style TargetType="{x:Type GridViewColumnHeader}">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </Style>
                    </GridView.ColumnHeaderContainerStyle>
                    <GridViewColumn CellTemplateSelector="{StaticResource fixSideViewLogItemTemplateSelector}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </ScrollViewer>
</DockPanel>

fixSideViewLogItemTemplateSelectorfixSideViewLogItemStyleSelector是选择器,它们为LogItems中的每个类型返回不同的数据类型或样式。常见的数据类型是一个有两列的网格,但这似乎也是无关紧要的 - 我试图在那里放一个文本框,它仍然被截断。Example of what I get

我希望将此列拉伸到整个gridView。当我设置列的宽度时,我看到列调整大小,但我希望它占据整个空间。这应该是弹性的 - 如果我在窗口中放置一个控件,它应该占据整个窗口,并在调整窗口大小时正确调整大小(使用它的列)。如果我放置两个控件,它们应该将空间分成两半,并且在调整窗口大小时仍应调整大小。

任何帮助,提示?

UPD 这是我正在使用的模板的一个例子。

 <DataTemplate x:Key="testCaseDataResultTemplate">
        <!-- Test case results -->
        <Grid Margin="50,0,0,0" HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="80"/>
                <!--Test case result property-->
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <!--Is retry / Name-->
                <RowDefinition />
                <!--Test case number-->
                <RowDefinition />
                <!--Low limit-->
                <RowDefinition />
                <!--High limit-->
                <RowDefinition />
                <!--Measured-->
                <RowDefinition />
                <!--State-->
                <RowDefinition />
                <!--Test time-->
                <RowDefinition />
                <!--Comment-->
            </Grid.RowDefinitions>
            <!--Is retry / Name-->
            <Image Grid.Column="0" Grid.Row="0" 
                               Source="..\Resources\retry16.png" 
                               Stretch="None" HorizontalAlignment="Left" 
                               Visibility="{Binding Path=IsRetry, Converter={StaticResource boolToVisibilityConverter}}" />
            <TextBlock Text="fh fhgfhg fhfhfhgfhg fhgfhfhgfhgfhgfhgfhgfhgf hgfhgfhgfhgfhgfhg fhfhgfhgf hgfhgfhfhg fhfhgf rdederserswerv 2" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" TextWrapping="Wrap" MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}"/>
            <!--Test case number-->
            <TextBlock Text="Number:" Grid.Column="0" Grid.Row="1" />
            <TextBlock Text="{Binding Path=TestCaseNumber}" Grid.Column="1" Grid.Row="1" />
            <!--Low limit-->
            <TextBlock Text="Low limit:" Grid.Column="0" Grid.Row="2" />
            <TextBlock Text="{Binding Path=TestCaseData.LimitData.LowLimit}" Grid.Column="1" Grid.Row="2" />
            <!--High limit-->
            <TextBlock Text="High limit: " Grid.Column="0" Grid.Row="3" />
            <TextBlock Text="{Binding Path=TestCaseData.LimitData.HighLimit}" Grid.Column="1" Grid.Row="3" />
            <!--Measured-->
            <TextBlock Text="Measured" Grid.Column="0" Grid.Row="4" />
            <TextBlock Text="{Binding Path=MeasuredValue, Converter={StaticResource valasaConverter}}" Grid.Column="1" Grid.Row="4" />
            <!--State-->
            <TextBlock Text="Passed: " Grid.Column="0" Grid.Row="5" />
            <TextBlock Text="{Binding Path=Passed}" Grid.Column="1" Grid.Row="5" />
            <!--Test time-->
            <TextBlock Text="Test time: " Grid.Column="0" Grid.Row="6" />
            <TextBlock Text="{Binding Path=TestTime, StringFormat={}{0:hh':'mm':'ss'.'ff}}" Grid.Column="1" Grid.Row="6" />
            <!--Comment-->
            <TextBlock Text="{Binding Path=ShortMessage}" 
                                   Grid.Column="0" Grid.Row="7" Grid.ColumnSpan="2"
                                   Visibility="{Binding Path=HasComment, Converter={StaticResource boolToVisibilityColConverter}}" 
                                   VerticalAlignment="Stretch" 
                                   MaxWidth="400" 
                                   TextAlignment="Center">
                            <TextBlock.ToolTip>
                            <StackPanel>
                                <TextBlock Text="{Binding Path=FullMessage}"/>
                            </StackPanel>
                            </TextBlock.ToolTip>
                        </TextBlock>
        </Grid>
    </DataTemplate>

这有点乱,但很简单。它有两列 - 标题和值。这些列与截断无关。

我也试过这个模板:

 <DataTemplate x:Key="testCaseDataResultTemplate">
    <TextBlock Text="Long long text goes here...... ->" HorizontalAlignment="Stretch"/>
 </DataTemplate>

文本当然更长:)它仍然是截断的,所以我责怪listView / GridView,而不是内部模板。

3 个答案:

答案 0 :(得分:1)

我认为这个问题可能是您需要将ListView.HorizontalContentAlignment设置为Stretch。此外,项容器样式和项模板必须包含HorizontalAlignmentStretchWidth属性必须为Auto。希望这个提示有帮助...

修改


另外我认为问题可能是GridViewColumn的宽度,它可以修复项目的宽度 它自己的宽度。如果您使用的是单个列,也许您可​​以将ListView更改为ListBoxItemsControl,只是一个想法。

答案 1 :(得分:0)

我不知道你的模板是什么样子但是我看到这样的问题,它通常是一个没有包装的TextBlock和/或TextBlock的宽度比它的父级长。

答案 2 :(得分:0)

不能说我解决了这个难题,但至少它可以按照我的预期运作。我用GridView和里面的列删除了整个定义,并将ItemTemplateSelector直接放在ListView中。

所以我的ListView现在看起来像这样:

            <ListView DockPanel.Dock="Top" Name="testCaseResultListView" 
                      ItemsSource="{Binding LogItems}" 
                      ItemContainerStyleSelector="{StaticResource fixSideViewLogItemStyleSelector}"
                      SelectionMode="Single"
                      HorizontalAlignment="Stretch"
                      HorizontalContentAlignment="Stretch"
                      ItemTemplateSelector="{StaticResource fixSideViewLogItemTemplateSelector}">

那就做到了!希望这也会对某人有所帮助。