我是WPF的新手,试图修复一个自动建议的DataGridComboBoxColumn
<DataGridComboBoxColumn x:Name="list_itemname" Width="*" Header="Item Name" >
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsEditable" Value="True"/>
<Setter Property="ItemsSource" Value="{Binding Path=itemlist}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
答案 0 :(得分:2)
您必须捕获与更改单元格有关的事件:CellEditEnding。首先,您必须声明处理事件的方法:
void cellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
var editedComboBoxColumn = e.EditingElement as ComboBox;
}
,然后将处理程序与您的网格挂钩:
<DataGrid x:Name="grid" CellEditEnding="cellEditEnding" />
答案 1 :(得分:1)
我建议您使用datagrid模板列,而不要使用datagrid组合框列。
大约
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox IsEditable="True"
Text="{Binding PropertyInRow}"
ItemsSource="{Binding itemlist}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
此处PropertyInRow是行视图模型中propprop的名称。无论您的数据网格的任何项目来源都必然是一个可观察的集合。
如果您想在文本更改时执行某些操作,则可以将代码放入该属性的设置器中。
这是mvvm模式,如果计划进行任何认真的wpf开发,则应该从一开始就学习这一点。当然,如果您打算在商业wpf团队中工作,因为他们都使用mvvm。
也。
如果itemlist在rowviewmodel中不是属性,而是在窗口viewmodel中的某个位置,则需要在该绑定上有一些相对源。
答案 2 :(得分:0)
如果您的ItemSource是ListCollectView,则可以这样获取当前项目:
public void OnCellValueChanged(object sender, CellValueChangedEventArgs e)
{
var currentItem = itemlist.CurrentItem; // to get the whole current item
// Or you just get the current changed cell value from the EventArgs:
var currentValue = e.Value?.ToString();
}