我正在将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并添加一个公共的“最后选择的单元格”属性。
答案 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会自动更新。从用户的角度来看,聚焦的数据网格行永远不会改变。