将绑定的SelectedItem属性设置为null的WPF DataGrid设置不起作用

时间:2012-10-22 16:00:24

标签: wpf binding datagrid selecteditem

我的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

3 个答案:

答案 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");
             }               
        }
    }