1

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

4

3 回答 3

1

您是否尝试过设置 VisibleOrderItems.CurrentItem = null?

此外,当前项目和选定项目之间存在差异,当前是占据 ICollectionView 中的 CurrentItem 属性的项目,而 SelectedItems 是当前以任何方式选择的所有项目的集合。无需选择当前项目。

于 2012-10-22T16:05:05.763 回答
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 块的末尾设置通知。

于 2012-10-22T16:20:34.827 回答
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");
             }               
        }
    }
于 2012-10-22T19:43:12.283 回答