单击一个Button后,使用附加属性获取DataGrid的CurrentCell

时间:2014-09-26 14:37:39

标签: c# wpf mvvm datagrid

我正在将MVVM模式用于简单的WPF应用程序。我的视图有一个DataGrid和一个Button。我的DataGrid有一个附加属性(附加属性的目的与我的问题不太相关)。

如果我单击DataGrid中的单元格然后单击Button,我的附属属性的“OnIsCurrentCellFocusedPropertyChanged”方法将执行。以下是此方法的摘录:

public static void OnIsCurrentCellFocusedPropertyChanged(DependencyObject source,
                                                         DependencyPropertyChangedEventArgs e)
{
    // This works; I confirmed it's returning the actual DataGrid in my view 
    // and not another "new" instance of DataGrid.
    var datagrid = source as DataGrid;

    if (!(bool)e.NewValue) return;

    // datagrid.CurrentCell is null!
    DataGridColumn cellColumn = datagrid.CurrentCell.Column;
    int colNumber = cellColumn.DisplayIndex;

    // datagrid.SelectedIndex is -1!
    int rowNumber = datagrid.SelectedIndex;

    // more code....
}

XAML代码段显示了我的DataGrid中的AttachedProperty:

<DataGrid FrozenColumnCount="1" local:CurrentCellFocusedExtension.IsCurrentCellFocused="{Binding IsFocused}" x:Name="companies" ItemsSource="{Binding Companies}"/>

我的问题是,我想从我的DataGrid获取CurrentCell,但是CurrentCell == null。我想这是因为当我点击Button时,焦点转移到Button并远离我的DataGrid(尽管在视图中仍然可以看到单元格)。令人不安的是SelectedIndex返回-1 ...我甚至无法得到行索引,更不用说选定的单元格了。

帮助?

一个想法:我可能是子类DataGrid并添加一个公共的“最后选择的单元格”属性。

1 个答案:

答案 0 :(得分:0)

我还没有想出一个附属物业解决方案。但是,就像@Will建议的那样,我在我的View Model中添加了一个int属性,“SelectedRow”。我的datagrid使用TwoWay绑定将其SelectedIndex绑定到我的vm的SelectedRow。在更改我的datagrid的SelectedIndex的代码触发之前,我将它保存到int变量,让代码运行以更改datagrid的SelectedIndex,然后将int变量的值赋给我的vm的SelectedRow属性。因为SelectedIndex通过TwoWay绑定绑定到SelectedRow,所以datagrid的SelectedIndex会自动更新。从用户的角度来看,聚焦的数据网格行永远不会改变。