在 DataGrid 中展开具有数字跨度的单元格

Posted

技术标签:

【中文标题】在 DataGrid 中展开具有数字跨度的单元格【英文标题】:Expand cell with number span in a DataGrid 【发布时间】:2014-03-28 19:21:30 【问题描述】:

我有一个DataGrid,当有人单击 DataGridCell 时,我希望值覆盖该单元格。最好的方法是什么?装饰层?自定义控件?

下面是一个例子。有人点击 DataGrid 的17.27,我想在它旁边显示价格范围。然后,用户可以选择一个值并将 DataGridCell 设置为新价格。一个转折是值在旁边,而不是下拉列表,或者我可以使用ComboBox

【问题讨论】:

您当前的代码是什么样的?你试过什么? 我刚刚了解了 adornerlayer 并想知道我是否在想这个。这看起来很复杂***.com/questions/5595243/… 我打算做下拉菜单,但我的用户说他想要所选单元格右侧的价格。 【参考方案1】:

在我看来,你会适合这个控件:


ComboBox

对于ComboBox,您可以设置动态范围,附加到集合中。在DataGrid 中,您可以使用DataGridTemplateColumn 列自己创建组合框:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="Binding Path=CustomObjectStringMember" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="Binding Path=CustomObjectListMember"
                      Text="Binding Path=CustomObjectStringMember" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

或者使用DataGridComboBoxColumn:

<DataGridComboBoxColumn Header="Current Category"
                        SelectedValueBinding="Binding Path=CurrentCategory"
                        SelectedValuePath="CategoryID"
                        DisplayMemberPath="CategoryName"
                        ItemsSource="Binding Source=StaticResource categoriesDataProvider" />

IntegerUpDown

IntegerUpDown 提供了一个带有按钮微调器的 TextBox,允许使用微调器按钮增加和减少 Nullable 值。


Popup + ListBox

尝试像这样使用PopupListBox

<Popup Name="MyPopUp"
       UseLayoutRounding="True"
       AllowsTransparency="False"
       IsOpen="True"
       Placement="Right">

    <Border Name="BorderContent" 
            UseLayoutRounding="True"
            Width="140"
            BorderThickness="1"
            BorderBrush="Black">

        <StackPanel Background="White">
            <TextBlock Background="White" 
                       Foreground="Black"
                       HorizontalAlignment="Center"
                       Text="MARKET" />

            <Separator Background="Black" Height="2" />

            <ListBox BorderBrush="Transparent">
                <ListBoxItem>17.27</ListBoxItem>
                <ListBoxItem>17.28</ListBoxItem>
                <ListBoxItem>17.29</ListBoxItem>
                <ListBoxItem>17.30</ListBoxItem>
            </ListBox>
        </StackPanel>
    </Border>
</Popup>       

Output

对于Popup,您可以将 Placement 设置为 Right 并为 ItemSource 使用动态集合。要在DataGrid 中显示弹出窗口,您需要将其放在CellEditingTemplate 中,如下所示:

<DataGridTemplateColumn Header="Test">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="Binding Path=Sample" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <Grid>
                <TextBox Text="Binding Path=Sample" />
                <Popup ... />
            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

【讨论】:

这可行,但我的用户想要项目旁边的框,而不是下拉框。 错误:DataTemplate 已经有一个孩子,无法添加弹出数据模板 @kay00:在 DataTemplate 中添加面板:&lt;DataTemplate&gt;&lt;Grid&gt;&lt;TextBox/&gt;&lt;Popup/&gt;&lt;/Grid&gt;。仔细看我的例子。 绑定时不会出现弹出窗口。例如 Text="Binding Path=Sample" 需要替换为 Text=Foo。此外,当我选择一个值时,它不会为单元格设置该值。但它被突出显示。 我的错误。弹出窗口确实出现了。但是一旦我选择了一个值,我该如何设置单元格的值呢?【参考方案2】:

我认为Popup 可能最适合这个。

【讨论】:

以上是关于在 DataGrid 中展开具有数字跨度的单元格的主要内容,如果未能解决你的问题,请参考以下文章

在 ios 中展开和折叠表格视图单元格

TableView 在 Swift 中展开和折叠单元格

当我在 ios 中展开和折叠 TableList 单元格时如何更改 UILabel 文本颜色

涉及行跨度时,根据内容自动调整 HTML 表格单元格的高度

突出显示 HTML 表格中悬停行中没有行跨度的单元格

如何让 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?