2012-10-22 240 views
1

我的DataGrid的SelectedItem绑定到下面的属性。WPF DataGrid设置将SelectedItem属性绑定为null不起作用

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重置程序的原因,是因为这是一个触摸屏的应用程序,而当他们选择项目,我希望它改变视图,然后当他们回到带有datagrid的视图时,我不想要一个项目被选中。

我试图创建一个单独的功能,只是送走的SelectedItem,并调用,当单独查看结束,还试图variuous绑定设置.... UpdateSourceTrigger =的PropertyChanged,模式=双向,IsSynchronizedWithCurrentItem

无法包裹我的头为什么这不起作用。

数据网格显示为高亮显示的行,但是当我点击该行这台_selectedItem(_selectedItem != value

+0

在“OnPropertyChanged”方法中执行任何空检查?如果可能的话,请在OnPropertyChanged方法中提供代码。 – Bathineni

回答

1

你试过设置VisibleOrderItems.CurrentItem = NULL?

另外,当前项目和选定项目之间存在差异,当前是占用ICollectionView中CurrentItem属性的项目,而SelectedItems是当前通过任何方式选择的所有项目的集合。当前项目不需要被选择。

+0

CurrentItem似乎只读 –

+0

我通常使用ListCollectionView和view.MoveCurrentTo(null)似乎为我工作。 –

+0

很好的建议,但它没有为我工作 –

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块的末尾。

+0

真的和我的代码没有区别。设置SelectedItem = null将再次执行设置器中的OnPropertyChanged –

0

在我的一个项目中,我遇到了和你一样的问题,因为我和你做了非常黑客的解决方案。 在XML - NotifyOnSourceUpdated=True是很重要的!:

 <DataGrid ItemsSource="{Binding Items}" 
SelectedItem="{Binding SelectedItem, Mode=TwoWay, NotifyOnSourceUpdated=True}"> 

在视图模型属性应该像代码波纹管。请注意,代码不包含您的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"); 
      }    
     } 
    } 
+0

同时http://stackoverflow.com/questions/857116/change-value-in-setter-property-when-using-wpf-two-way-databinding接缝像有效方法来做同样的事情,但然后你必须通过datagrid实例viewmodel这是不好的... – Igor

相关问题