C# DataGrid.SelectedItem未绑定到当前选定的单元格
在好几次场合遇到了这个问题 在右键单击菜单或选择单元格中的组合框上查找SelectedItem或selected列时。SelectedItem将为空或先前选择的行C# DataGrid.SelectedItem未绑定到当前选定的单元格,c#,xaml,binding,datagrid,C#,Xaml,Binding,Datagrid,在好几次场合遇到了这个问题 在右键单击菜单或选择单元格中的组合框上查找SelectedItem或selected列时。SelectedItem将为空或先前选择的行 private void ComboBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { // Correct m_BeginEditString = ((ComboBox)sender).SelectedValue.ToString();
private void ComboBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
// Correct
m_BeginEditString = ((ComboBox)sender).SelectedValue.ToString();
// Wrong. selected item is last selected row, example clicking directly on combobox will not select row, and be null.
m_BeginEditRow = (RowItem)MyDataGrid.SelectedItem;
}
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding myItem, Mode=TwoWay,
NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Source={StaticResource enum}}"
SelectionChanged="ComboBox_Changed"
LostKeyboardFocus="ComboBox_LostKeyboardFocus"
GotKeyboardFocus="ComboBox_GotKeyboardFocus" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
private void组合框\u获取KeyboardFocus(对象发送器,KeyboardFocusChangedEventArgs e){
//正确的
m_BeginEditString=((组合框)sender).SelectedValue.ToString();
//错误。所选项目是最后选定的行,直接单击组合框将不会选择行,并且为空。
m_BeginEditRow=(RowItem)MyDataGrid.SelectedItem;
}
您可以通过父对象进行访问,并尝试访问您想要的任何内容,而不是直接访问所选项目。这是另一种方法。我希望这对你有帮助
Combobox objMyButton = null;
if (sender is Combobox)
{
objMyButton = (sender as Combobox );
}
//You can access the parent object which means corresponding DataGridRow and do whatever you want
for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
if (vis is DataGridRow)
{
var row = (DataGridRow)vis;
break;
}
以完全不同的方式解决,感谢@Ramesh Muthiah的指导:
private void ComboBox_Changed(object sender, SelectionChangedEventArgs e) {
if (((ComboBox)sender).IsLoaded) { // disregard SelectionChangedEvent fired on population from binding
if (e.RemovedItems.Count != 0) {
for (Visual visual = (Visual)sender; visual != null; visual = (Visual)VisualTreeHelper.GetParent(visual)) { // Traverse tree to find corred selected item
if (visual is DataGridRow) {
DataGridRow row = (DataGridRow)visual;
m_BeginEditRow = new MyRowItem((MyRowItem)row.Item); // Copy constructor, otherwise passed by reference
break;
}
}
MyEnum newItem = (MyEnum)e.AddedItems[0];
MyEnum oldItem = (MyEnum)e.RemovedItems[0];
if (m_BeginEditRow.Combo1 == newItem) {
m_BeginEditRow.Combo1 = oldItem;
} else {
m_BeginEditRow.Combo2 = oldItem;
}
DoStuff(m_BeginEditRow, false);
}
}
}此组合框是否位于数据网格的单元格中?在您的评论中,您谈论的是单击,但看起来您正在处理“键盘焦点”事件。你能澄清一下吗?@glace ComboBox在DataGrid的单元格中:不明白为什么if(发送方是ComboBox)也能遍历可视化树。但是在这些处理程序上旋转了很多次。这样,当我想要m_BeginEditRow时,它就是新值,即使组合框还没有关闭