我的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的原因是因为这是一个触摸屏应用程序,当他们选择项目时,我想让它更改View,然后当他们回到View时数据网格我不希望选择一个项目。
我尝试创建一个单独的函数,只清除SelectedItem,并在单独的View完成后调用它,并尝试各种绑定设置.... UpdateSourceTrigger = PropertyChanged,Mode = TwoWay,IsSynchronizedWithCurrentItem
无法解决为什么这不起作用。
DataGrid将行显示为突出显示,但当我单击该行时,它会设置_selectedItem(_selectedItem != value
)
答案 0 :(得分:1)
您是否尝试过设置VisibleOrderItems.CurrentItem = null?
此外,当前项目和所选项目之间存在差异,当前是ICollectionView中占用CurrentItem属性的项目,而SelectedItems是当前以任何方式选择的所有项目的集合。无需选择当前项目。
答案 1 :(得分:0)
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。
答案 2 :(得分:0)
在我的一个项目中,我遇到了与你完全相同的问题,我做了一个非常讨厌的解决方案。
在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");
}
}
}