【问题标题】:How to place CheckBoxes in different rows/columns within a ListBox in WPF?如何在 WPF 中的 ListBox 内的不同行/列中放置 CheckBox?
【发布时间】:2015-12-11 18:56:26
【问题描述】:

在我的 WPF 桌面应用程序中,我有一个 ListBox,我想用两行和两列(即 2x2 网格)显示,在四个行/列点中的每一个点都有一个复选框 - 我的 XAML 代码是以下。请注意,我不想进行任何数据绑定。下面的代码有效,但显示的是所有四个 CheckBox 都在彼此之上,即使我已经指定它们应该位于不同的行/列中。有人可以指出我做错了什么以及如何更正 XAML?我在互联网上找到的每个示例都是数据绑定示例,这需要没有数据绑定(即显式)。

<ListBox Margin="0,0,10,10" Name="myListBox" Height="139" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="112" >
    <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50"/>
            <ColumnDefinition Width="50"/>
        </Grid.ColumnDefinitions>
        </Grid>
    </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <CheckBox Content="WCF"  Grid.Row="0" Grid.Column="0"/>
    <CheckBox Content="ASP.NET"  Grid.Row="0" Grid.Column="1"/>
    <CheckBox Content="Java"  Grid.Row="1" Grid.Column="0"/>
    <CheckBox Content="C+"  Grid.Row="1" Grid.Column="1"/>
</ListBox>

【问题讨论】:

  • 恐怕你不能在没有绑定的情况下做到这一点。 ListBox 将项目包装在 ListBoxItem 中,它成为 ItemsPanel 的直接子项,您可以通过绑定在 ItemsContainerStyle 中设置 Grid.Column 和/或 Grid.Row
  • 谢谢。我使用 ListBox 因为它是可滚动的,如果我想添加更多行。您是否建议切换到 ListView、DataGrid 或其他控件? (再次,因为我不需要这些数据绑定)
  • 那么不要使用ListBox,把你的Grid放到ScrollViewer
  • 我认为您使用 ScrollViewer 是对的。但是,所以我可以学习如何通过绑定来做到这一点,你是否有一个简单示例的链接,说明如何通过绑定列表(使用 ScrollViewer、ListBox、ListView 等)来做到这一点?
  • 如果你想通过绑定检查this回答例如

标签: wpf xaml listview listbox itemspaneltemplate


【解决方案1】:

您误用了ListBoxListBoxItemsControl 并且您并没有真正处理绑定项目,因此您应该使用不同的控件来实现您的解决方案。像下面这样的东西应该可以工作:

<ScrollViewer Height="50"
              HorizontalAlignment="Center">
    <WrapPanel Width="150">
        <CheckBox Name="Wcf"
                  Content="WCF"
                  Width="75" />
        <CheckBox Name="Asp"
                  Content="ASP.NET"
                  Width="75" />
        <CheckBox Name="Java"
                  Content="Java"
                  Width="75" />
        <CheckBox Name="WhatIsThis"
                  Content="C+"
                  Width="75" />
        <CheckBox Content="WCF"
                  Width="75" />
        <CheckBox Content="ASP.NET"
                  Width="75" />
        <CheckBox Content="Java"
                  Width="75" />
        <CheckBox Content="C+"
                  Width="75" />
        <!-- add as many items as you want -->
    </WrapPanel>
</ScrollViewer>

如果您希望内容可滚动,则将ScrollViewer 包裹在您的WrapPanel 周围并在其上设置高度。

证明:

注意:我强烈建议您尽可能使用数据绑定。

【讨论】:

  • 谢谢。我使用 ListBox 因为它是可滚动的,如果我想添加更多行。您是否建议切换到 ListView、DataGrid 或其他控件? (再次,因为我不需要这些数据绑定)
  • @swabygw 如果您尝试使用硬编码标签定义布局,最好不要使用继承自 ItemsControl 的任何内容(例如 ListBox),除非您打算添加从代码隐藏到控件的项目(实际上应该只使用数据绑定,但我有偏见)
  • 我认为您使用 ScrollViewer 是对的。但是,所以我可以学习如何通过绑定来做到这一点,你是否有一个简单示例的链接,说明如何通过绑定列表(使用 ScrollViewer、ListBox、ListView 等)来做到这一点?
  • 那里有很多 MVVM/数据绑定示例。在this 问题中可以找到我更详细的 MVVM 示例之一。简而言之,您将构建一个选项集合,将其绑定到ItemsControl.ItemsSource,并使用DataTemplate 定义ItemsControl.ItemTemplate。如果这个答案被标记在答案中,也许我会写一个详细的例子;)
猜你喜欢
  • 1970-01-01
  • 2011-01-04
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多