【问题标题】:wpf ListBox looks like datagrid?wpf ListBox 看起来像数据网格?
【发布时间】:2014-06-17 07:50:01
【问题描述】:

我的应用中有一个列表框控件。 我想将他的样式更改为看起来像 Datagrid(边框、列、行......)。 我不想使用标准数据网格 - 因为它的控件无法绑定 itemtemplte。 我正在尝试这样做:

 <ListBox 
                    ItemsSource="{Binding Items}" 
                    HorizontalContentAlignment="Stretch"
                    VerticalContentAlignment="Stretch"
                    Name="listBox1"
                    HorizontalAlignment="Stretch"
                    VerticalAlignment="Stretch" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                    <Border BorderThickness="1" BorderBrush="Black">
                                        <TextBlock   Text="{Binding Id}" Margin="5"/>
                                    </Border>
                                    <Border BorderThickness="1" BorderBrush="Black">
                                        <TextBlock   Text="{Binding Name}" Margin="5"/>
                                    </Border>
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

但它看起来不太好 - 如下:

这是我想要达到的目标:

【问题讨论】:

  • 你是问如何让列表框中的每一项都统一大小吗?
  • 我不想使用标准数据网格 - 因为它的控件无法绑定 itemtemplte... 想详细说明这句话吗?我认为你可能弄错了,毕竟可能使用DataGrid
  • 我可以改变lisbox,我需要什么? 3 件事 - 用于绑定我的 observable 列表的 itemsource,以及用于绑定自定义元素的 itemtemplate,最后一件事 - 像 excel 或 datagrid 这样的样式 - 我的意思是每个单元格都将被边框和统一大小到最大宽度。
  • 选择器?你的意思是选择当前行?所以是的-它在弹出控件中-我实现了自定义自动完成并为用户弹出了一个列表框项-需要选择一行...
  • 而不是编写复杂的控件 - 可以在 itemtemplate 中使用 stackpanel 或类似的东西吗?

标签: wpf datagrid listbox


【解决方案1】:

使用 Grid.IsSharedSizeScope

结果

我相信您希望根据您的字符串长度重新调整列的大小,因此 Grid.IsSharedSizeScope 是您的选择

示例 xaml

    <ListBox ItemsSource="{Binding Items}"
             Grid.IsSharedSizeScope="True">
        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="name" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Border BorderThickness="1"
                            BorderBrush="Black">
                        <TextBlock Text="{Binding Name}"
                                     Margin="5" />
                    </Border>
                    <Border BorderThickness="1"
                            Grid.Column="1"
                            BorderBrush="Black">
                        <TextBlock   Text="{Binding Id}"
                                     Margin="5" />
                    </Border>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

如果您将 SharedSizeGroup 移动到 id 如下所示

<Grid.ColumnDefinitions>
    <ColumnDefinition />
    <ColumnDefinition SharedSizeGroup="id" />
</Grid.ColumnDefinitions>

结果

将 ListView 与 GridView 结合使用

您可以选择将列表视图与网格视图一起使用,其外观与具有列表灵活性的网格相同

例如

    <ListView ItemsSource="{Binding SourceItems}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Column1"
                                DisplayMemberBinding="{Binding Column1}" />
                <GridViewColumn Header="Column2"
                                DisplayMemberBinding="{Binding Column2}" />
            </GridView>
        </ListView.View>
    </ListView>

GridViewColumn 提供您修改 CellTemplate、HeaderTemplate、HeaderContainerStyle、HeaderStringFormat 等。

【讨论】:

  • 谢谢,但我不想使用listview+gridview,这是因为我无法将自定义itemtemplate绑定到gridview..
  • 您可以使用 CellTemplate 来指定您的自定义模板。
  • CellTemplate 为每一列指定自定义模板 - 我的意思是我想将 itemtemplate 绑定到列,这在 gridView 中是不可能的,对于 gridview,我需要编写:GridView->GridView.Columns- >...
  • 好的,您能否发布一张您预期输出的图片,我可以尝试创建相同的。
  • 我编辑了我的问题并附上了我期望得到的图片。谢谢。
【解决方案2】:

我相信您可以使用网格控件来实现这一点(它支持绑定和其他一切)

要解决您的问题,您必须为堆栈面板内的两个边框设置固定宽度,然后您的列表框项目将看起来像一个网格控件。

<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                    <Border Width="150" BorderThickness="1" BorderBrush="Black">
                                        <TextBlock   Text="{Binding Id}" Margin="5"/>
                                    </Border>
                                    <Border Width="50" BorderThickness="1" BorderBrush="Black">
                                        <TextBlock   Text="{Binding Name}" Margin="5"/>
                                    </Border>
                                </StackPanel>

请告诉我们您在使用 GridControl 时遇到了什么问题,也许我们也可以解决这个问题

编辑。如果您使用的是 DataGrid,您的模板将如下所示

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" HeadersVisibility="None">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="" Width="SizeToCells" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text={Binding Id}/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
<DataGridTemplateColumn Header="" Width="SizeToCells" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text={Binding Name}/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

请注意,我已将 HeaderVisibility 设置为 false,因此它看起来不像数据网格,而是看起来像列表

【讨论】:

  • 谢谢,我不想设置固定宽度,因为有时会有长句或短句——我想将列表框项扩展到最长项的最大宽度。网格控制?你的意思是数据网格?还是网格?网格可以获取itemsource吗?和样式 itemtemplate?
  • 抱歉GridControl,您可以定义itemssource,然后为您的数据项定义模板
  • wpf 没有 GridControl - 你的意思是 devexpress 控制?
  • 抱歉,是的,我一直在使用 Devexpress GridControl,所以我很困惑。您可以使用 DataGrid 并仍然使用您的 DataTemplates 吗?
  • Datagrid 有问题:\ 因为我无法绑定列 - 我需要在列内写入...
猜你喜欢
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2012-08-24
  • 2011-07-30
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多