WPF DataGrid.SelectedItem赋值不起作用

时间:2013-12-23 14:45:28

标签: wpf mvvm datagrid

我有一个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设置为对象,但是如何从行中获取对象?

1 个答案:

答案 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();