WPF DataGrid 将 SelectedItem 属性绑定为 null 不起作用
Posted
技术标签:
【中文标题】WPF DataGrid 将 SelectedItem 属性绑定为 null 不起作用【英文标题】:WPF DataGrid setting bound SelectedItem property to null does not work 【发布时间】:2012-10-12 11:39:34 【问题描述】:我的 DataGrid 的 SelectedItem 绑定到下面的属性。
public OrderItemViewModel SelectedItem
get return _selectedItem;
set
if (_selectedItem != value)
_selectedItem = value;
OnPropertyChanged(() => SelectedItem);
if (_selectedItem != null && _isReturnMode)
if (_selectedItem.OrderItemModel.ProductDetails.IsConstructed)
VisiblePaymentViewModel = new ViewReturnComponentsViewModel(this, value.OrderItemModel.ProductDetails);
else
VisiblePaymentViewModel = new EditReturnItemViewModel(this, value);
SelectedItem = null;
DataGrid 的 ItemsSource 绑定到
public ICollectionView VisibleOrderItems get; set;
我之所以要在程序中重置SelectedItem,是因为这是一个触摸屏应用程序,当他们选择项目时,我希望它改变视图,然后当他们回到视图时数据网格我不想选择一个项目。
我尝试创建一个单独的函数来清除 SelectedItem,并在单独的 View 完成时调用它,还尝试了各种绑定设置.... UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, IsSynchronizedWithCurrentItem
无法理解为什么这不起作用。
DataGrid 将该行显示为突出显示,但是当我单击该行时,它会设置 _selectedItem (_selectedItem != value
)
【问题讨论】:
是否在“OnPropertyChanged”方法中进行任何空检查?如果可能,请在 OnPropertyChanged 方法中提供代码。 【参考方案1】:您是否尝试过设置 VisibleOrderItems.CurrentItem = null?
此外,当前项和选定项之间存在差异,当前项是占用 ICollectionView 中的 CurrentItem 属性的项,而 SelectedItems 是当前以任何方式选择的所有项的集合。无需选择当前项目。
【讨论】:
我通常使用 ListCollectionView 和 view.MoveCurrentTo(null) 似乎对我有用。【参考方案2】:if (_selectedItem != value)
_selectedItem = value;
if (_selectedItem != null && _isReturnMode)
if (_selectedItem.OrderItemModel.ProductDetails.IsConstructed)
VisiblePaymentViewModel = new ViewReturnComponentsViewModel(this, value.OrderItemModel.ProductDetails);
else
VisiblePaymentViewModel = new EditReturnItemViewModel(this, value);
SelectedItem = null;
OnPropertyChanged(() => SelectedItem);
在 if 块的末尾设置 Notify。
【讨论】:
这和我的代码真的没有区别。设置 SelectedItem = null 将再次执行 setter 中的 OnPropertyChanged【参考方案3】:在我的一个项目中,我遇到了与您完全相同的问题,并且我做了下面非常骇人听闻的解决方案。
在 xml 中 - NotifyOnSourceUpdated=True
很重要!:
<DataGrid ItemsSource="Binding Items"
SelectedItem="Binding SelectedItem, Mode=TwoWay, NotifyOnSourceUpdated=True">
在 viewmodel 中的属性应该看起来像下面的代码。请注意,代码不包含您的 if 条件,但我确信它足够清楚:
public TestModel SelectedItem
get return selectedItem;
set
selectedItem = value;
if (selectedItem != null)
//.....do something with selected item
//actual hack, execute SelectedItem = null async on UI thread
System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke((ThreadStart)(() =>
SelectedItem = null;
));
else
OnPropertyChanged("SelectedItem");
【讨论】:
另外***.com/questions/857116/… 接缝就像做同样事情的有效方法,但是你必须将数据网格实例传递给不好的视图模型......以上是关于WPF DataGrid 将 SelectedItem 属性绑定为 null 不起作用的主要内容,如果未能解决你的问题,请参考以下文章