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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将 DataGrid 放入 ComboBox

wpf datagrid 滚动条如何设置宽度和颜色

wpf datagrid 怎么增加数据行

wpf datagrid cell 设置焦点

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?

找不到将Wpf DataGrid列绑定到属性的方法[关闭]