我的视图模型中有一个ObservableCollection“things”,并且在additonal ObservableCollections中有几个已过滤的列表子集。我在屏幕上有两个DataGrids,我将它们分别绑定到一个子集ObservableCollections。
两个DataGrids都将其SelectedItem属性绑定到视图模型中的SelectedThing属性。
当我以编程方式更改SelectedThing或通过选择两个网格之一中的行时,它将按预期更改。如果SelectedThing现在指向的项目存在于网格中,则网格将更新其选定的项目。
所以这就是我的问题......如果网格的ItemSource中不存在SelectedThing,则选择就像没有发生任何事情一样,并保持在SelectedThing更改之前的状态。理想情况下,如果基础视图模型属性不再设置为网格的ItemsSource中的某些内容,我希望选择清除...任何人都有任何建议吗?
答案 0 :(得分:2)
确定。搞定了。如果它在将来帮助其他人,这就是它的工作原理...... 在您的代码中,为视图模型的PropertyChanged事件注册事件处理程序,然后使用它来检查每个网格以查看它是否包含所选项目。如果没有,则清除该网格中的选定内容。我还修改了我的SelectedThing属性以忽略传入的NULL值以避免死锁(在我的应用程序中,它在初始化后永远不会为NULL)
_vm是一个返回我的视图模型的属性。
_vm.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_vm_PropertyChanged);
void _vm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "SelectedThing")
{
CheckSelection(grid1, _vm.SelectedThing);
CheckSelection(grid2, _vm.SelectedThing);
}
}
void CheckSelection(DataGrid grid, object selectedItem)
{
if (grid.ItemsSource != null)
{
bool itemInGrid = false;
foreach (var item in grid.ItemsSource)
{
if (item == selectedItem)
{
itemInGrid = true;
break;
}
}
if (!itemInGrid) // clear selection
{
grid.SelectedItem = null;
// not sure why, but this causes the highlight to clear. Doesn't work otherwise
grid.IsEnabled = false;
grid.IsEnabled = true;
}
}
}