在 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
尝试像这样使用Popup
和ListBox
:
<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 中添加面板:<DataTemplate><Grid><TextBox/><Popup/></Grid>
。仔细看我的例子。
绑定时不会出现弹出窗口。例如 Text="Binding Path=Sample" 需要替换为 Text=Foo。此外,当我选择一个值时,它不会为单元格设置该值。但它被突出显示。
我的错误。弹出窗口确实出现了。但是一旦我选择了一个值,我该如何设置单元格的值呢?【参考方案2】:
我认为Popup
可能最适合这个。
【讨论】:
以上是关于在 DataGrid 中展开具有数字跨度的单元格的主要内容,如果未能解决你的问题,请参考以下文章