2016-06-30 8 views
1

나는 ComboBox of Employers가있다. 고용주를 선택하면, 테이블은 고용주 특정 데이터로 채워진 : 여기 WPF ComboBox가 변경 될 때 변경됨

 <ComboBox Name="EmployerListBox" 
        IsReadOnly="True" 
        ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}" 
        SelectedItem="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}" 
        Width="150" /> 

그것이 결합되어있는 속성 테이블 더러운 있는지 여부를 확인하는 방법이다.

/// <summary> 
    /// Selected Employer 
    /// </summary> 
    public String SelectedEmployer 
    { 
     get 
     { 
      return _SelectedEmployer; 
     } 
     set 
     { 
      if (_SelectedEmployer != value && CanChangeEmployer()) 
      { 
       _SelectedEmployer = value; 
       NotifyPropertyChanged(m => m.SelectedEmployer); 
       GetGarnishmentsTableView(); 
      } 
     } 
    } 
    private String _SelectedEmployer = ""; 


    /// <summary> 
    /// Method that executes each time user wants to change employers 
    /// </summary> 
    public Boolean CanChangeEmployer() 
    { 
     Boolean _returnValue = true; 

     if (GarnishmentsTableIsDirty) 
     { 
      _returnValue = false; 

      MessageBoxResult _change = 
       MessageBox.Show("There are unsaved changes. " + 
           "Changing Employers will lose any unsaved changes. \n\n" + 
           "Are you sure you want to change Employers?", "Unsaved Changes", MessageBoxButton.YesNo); 
      if (_change == MessageBoxResult.Yes) 
      { 
       // OK to switch employers 
       _returnValue = true; 
      } 
     } 

     return _returnValue; 
    } 

모든 것이 제대로 작동하려면 나타납니다 : 테이블이 더러운 경우, 사용자들은 고용주가 변경하는 경우 변경 내용이 손실 될 수 있다는 메시지가 표시됩니다

  • 사용자는 고용주 ('KMH')를 선택하는 업데이트 표.
  • 사용자가 테이블을 변경합니다.
  • 사용자는
  • 사용자가 변경 '없음'
  • 사용이 선택됩니다 손실되고 (변경하지 않습니다 CanChangeEmployers 반환 '거짓'
  • SelectedEmployer이 경우 생략 할 수 있다는 메시지가 표시되고 다른 고용주 ('MPC')를 선택 {} 블록

그러나 SelectedEmployer가 변경되지 않았더라도 고용주 옵션이 사용자가 선택한 고용주 ('MPC')로 변경됩니다.

ComboBox를 스누핑하면 ComboBox SelectedItem이 원래의 Employer ('KMH')로 올바르게 설정되어 있지만 SelectedValue와 SelectionBoxItem이 모두 새 Employer ('MPC')로 설정되어있는 것을 볼 수 있습니다.

나는 다음 SelectedEmployer에 바인딩 ComboBox-> SelectedValue을 시도 :

 <ComboBox Name="EmployerListBox" 
        IsReadOnly="True" 
        ItemsSource="{Binding EmployerCollection, UpdateSourceTrigger=PropertyChanged}" 
        SelectedValue="{Binding SelectedEmployer, UpdateSourceTrigger=PropertyChanged}" 
        Width="150" /> 

를 그리고 GUI가 표시되는 같은 잘못된 회사입니다. 그러나 이번에 스눕은 ComboBox-> SelectedValue가 원래 고용주 ('KMH')에게 올바르게 설정되어 있지만 SelectedItem과 SelectionBoxItem이 모두 새 고용주 ('MPC')로 설정되어 있음을 보여줍니다.

GUI가 선택된 고용주와 일치하도록 SelectedEmployer를 올바르게 바인딩하려면 어떻게합니까?

+0

CanChangeEmployer()가 false를 반환하는 경우 NotifyPropertyChanged (...)를 호출 해보십시오. 그렇지 않으면 바인딩 하위 시스템에서 SelectedEmployer 속성이 실제로 지정된 값으로 설정되었다고 가정 할 수 있습니다. 실제로는 업데이트되지 않았습니다. –

+1

[MVVM을 사용하여 WPF에서 콤보 상자 선택 취소] 가능한 복제본 (http://stackoverflow.com/questions/7800032/cancel-combobox-selection-in-wpf-with-mvvm) –

답변

3

ComboBox가 선택을 변경하고 Binding이 viewmodel을 업데이트 한 다음 viewmodel이 비공개 필드를 변경하지 않도록 선택하는 경우입니다. 그러나 ComboBox는 변경 사항이 거부되었음을 어떻게 알 수 있습니까? 너는 그것을 말하지 않고있다.

SelectedEmployer.set은 이전 값을 유지하기로 결정한 후에 SelectedEmployer에 대해 간단히 PropertyChanged을 올릴 수는 있지만 실제로 작동시키지 못한다고 생각할 수 있습니다.

올바른 방법은 유효성 검사를 사용하는 것입니다. 사용자의 뷰 모델에 IDataErrorInfo을 구현하십시오. Here's a tutorialhere's another article. 유효성 검사를 통해 IDataErrorInfo.this[propName].get 메서드는 보다 먼저 호출되어이되고 ComboBox은 새 선택을 허용하고 새 선택을 거부하는 옵션이 제공됩니다. 이것이 당신이 찾고있는 것입니다. 빨간색 윤곽선 오류 UI를 원하지 않는다면 템플릿을 사용하여이를 제거 할 수 있습니다.

SelectionChanged을 처리하려고 유혹하지만, 이벤트 인수는 Cancel이없는, 그래서 당신은 어떤 논리를해야합니다, 그래서 당신은 다시 다시 SelectionChanged을 제기하는 무엇을 사용했는지에 SelectedItem 설정 붙어있어 무한히 재귀하는 것을 막을 수 있습니다. 일단 당신이 그것을 고치면, 당신이 이전 값으로 다시 설정하기 전에 초기 선택이 완료되기 때문에 눈에 보이는 "깜박임"이 여전히 있습니다. 개인적으로 프레임 워크를 능가하려고 시도하는 것보다 IDataErrorInfo을 구현하는 것이 경미한 것을 선호합니다.

UPDATE

Here's a kinda-kludgey variant of my first idea that actually works. 그러나 동일한 플리커 문제가 있습니다. 이상적인 것은 아니지만 검증 작업보다 훨씬 적은 작업입니다. DispatcherPriority.ApplicationIdle은 그것이 효과를냅니다 : ComboBox의 선택 변경 이벤트 항목에서 모든 먼지가 해결 될 때까지 실제로 람다를 실행하기를 기다립니다. DispatcherPriority.Background도 저에게 효과적입니다.

관련 문제