我有一个WPF DataGrid,当用户从一堆选项中选择一个词典时,就会设置DG的ItemsSource
。
我在DG中添加了一列CheckBoxes并进行设置,以便一次只能有一行IsChecked = true
。当用户“检查”其中一个框时,Checked
事件处理程序遍历所有行,并将IsChecked = false
设置为除SelectedItem
之外的每一行的CheckBox,只留下用户选择的行为IsChecked = true
。当用户使用CheckBox为Checked
时,此方法可以正常工作。
但是这个CheckBox列没有“绑定”到Dictionary中的任何数据片段。因此,当用户“选择”将哪个字典绑定到DG时,该字典中的“默认”对象不会标记为“默认”。因此,在设置.IsChecked = true
后,我会尝试ItemsSource
正确的行。
但问题在于我的Checked
事件处理程序IsChecked = false
除了SelectedItem
之外的所有内容,然后检查SelectedItem
。
当用户最初选择将哪个词典绑定到DG时,将以编程方式填充(并检查)DG。因此SelectedItem
始终是第一行。因此,DG IsChecked = true
不是IsChecked = true
ACTUAL默认对象,而是第一行。
最紧急的解决方案:
我试图修改Checked
事件处理程序,以便不是获取SelectedItem
,而是确定哪一行是“默认”行,“取消选择”所有其他行,并且仅“选择”此行。但由于某些原因,这个电话不起作用。
dataGridSymbols.UnselectAll()
dataGridSymbols.SelectedItem = row
有人知道这次电话有什么问题吗?我知道我正确设置了行。也许我需要将SelectedItem设置为对象,但是如何从行中获取对象?
答案 0 :(得分:0)
我想出来了。我最终找到了一种方法来使用调用Checked
事件处理程序的行,而不是使用SelectedItem(只返回突出显示的那个)。这是解决它的代码,以防有人想看。
var cell = sender as DataGridCell;
if (cell == null)
return;
// Keep getting parents until you get to the sender's row...
var parent = VisualTreeHelper.GetParent(cell);
while (parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
var row = parent as DataGridRow;
if (row == null)
return;
var rowIndex = row.GetIndex();