WPF ListViewItem宽度绑定未按预期工作

时间:2011-07-07 09:45:49

标签: wpf listview sizing

我遇到的问题是将listviewitems的大小调整为网格第二列中可用的空间。我有一个ValidationItemError类,可以有一个很长的描述。这是它的DataTemplate xaml。

<DataTemplate DataType="{x:Type Models:ValidationItemError}">
    <StackPanel>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <Ellipse Width="10"
                     Height="10"
                     Margin="5,0,0,0"
                     Fill="Crimson" />
            <TextBlock Text="{Binding ColumnName}"
                       Grid.Column="1"
                       FontWeight="Bold" />
        </Grid>
        <TextBlock Text="{Binding Description}"
                   ToolTip="{Binding Description}"
                   Margin="20,0,0,0"
                   TextWrapping="Wrap" />
    </StackPanel>
</DataTemplate>

validationItemErrors被分组到另一个类ValidationLineItem,这是它的DataTemplate

<DataTemplate DataType="{x:Type Models:ValidationLineItem}">
    <StackPanel>
        <Grid Margin="0,10,0,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="35"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <TextBlock Text="Line"
                       FontSize="16"
                       FontWeight="Bold" />
            <TextBlock Text="{Binding LineNumber}"
                       Margin="5,0,0,0"
                       FontSize="16"
                       Grid.Column="1" />
        </Grid>
        <ItemsControl ItemsSource="{Binding ValidationItems}">
        </ItemsControl>
    </StackPanel>
</DataTemplate>

所以基本上我有一个validationLineItem,用于存储亚麻和存储在ValidationItems属性中的多个ValidationItemError / Warnings。所以现在我只是将数据绑定到网格左栏的列表视图中。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="75*" />
        <ColumnDefinition Name="GridCell" Width="25*" />
    </Grid.ColumnDefinitions>
    <ScrollViewer Grid.Column="1">
        <ListView ItemsSource="{Binding ValidationItems}"                          
                  SelectedItem="{Binding SelectedValidationItem}"                          
                  SelectionChanged="ListViewSelectionChanged">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="Width"
                            Value="{Binding ElementName=GridCell, Path=Width}" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </ScrollViewer>
</Grid>

除了这部分

之外,所有渲染都很好
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Width"
                Value="{Binding ElementName=GridCell, Path=Width}" />
    </Style>
</ListView.ItemContainerStyle>

描述文本块忽略宽度设置,不会像我需要的那样换行。 如果我手动设置宽度像

<Setter Property="Width" Value="100" />

而不是

<Setter Property="Width" Value="{Binding ElementName=GridCell, Path=Width}" />

描述文本块按我的意愿包装。 有人有主意吗?我相信我在这里缺少一些简单的东西。

我应该注意,我已经尝试过这个但没有运气。

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment"
                Value="Stretch" />
    </Style>
</ListView.ItemContainerStyle>

1 个答案:

答案 0 :(得分:4)

您的问题是ListView内部构建ScrollViewer会导致问题。

在我看来,你只想要内容包装。请放弃ItemContainerStyle并将其添加到ListView

ScrollViewer.HorizontalScrollBarVisibility="Disabled"

这将禁用水平滚动条并使您的内容换行!

希望这有帮助!

为了完整性:

<ListView ItemsSource="{Binding ValidationItems}"                          
              SelectedItem="{Binding SelectedValidationItem}"                          
              SelectionChanged="ListViewSelectionChanged" 
              ScrollViewer.HorizontalScrollBarVisibility="Disabled" />