2012-10-22 3 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; 
      } 
     } 
    } 
} 

데이터 격자의 ItemsSource가

public ICollectionView VisibleOrderItems { get; set; } 

내가 프로그램에서의 selectedItem을 재설정 할 이유에 바인딩,이 터치 스크린 응용 프로그램이기 때문에, 그리고 그들은 항목을 선택하면, I 보기를 변경하려고 할 때 데이터 그리드를 사용하여보기로 돌아갈 때 항목을 선택하지 않아도됩니다.

난 그냥의 selectedItem을 지 웁니다 별도의 함수를 만드는 시도하고, 별도의보기가 완료되면, 또한 variuous 바인딩 설정 .... UpdateSourceTrigger =하여 PropertyChanged, 모드 = 양방향을 시도하는 것이 호출했습니다 IsSynchronizedWithCurrentItem

이것이 작동하지 않는 이유에 대해 머리를 감쌀 수 없습니다.

데이터 격자가 강조로 행을 표시하지만 해당 행을 클릭하면이 _selectedItem이 (_selectedItem != value)

+0

"OnPropertyChanged"메소드에서 null 체크를 수행하고 있습니까? 가능한 경우 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은 setter에서 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 유효한 이음새 같은 일을하는 방법,하지만 당신은 좋은 아닌 viewmodel에 datagrid 인스턴스를 전달해야합니다 ... – Igor

관련 문제