2011-11-18 5 views
1
<Combobox ItemsSource="{Binding Path=Delimiters}" DisplayMemberPath="Key" 
SelectedValue="{Binding Path=SelectedDelimiter, UpdateSourceTrigger=PropertyChanged}" /> 

을 복용하지 뒤에 코드에서 선택한 값을 설정 .사전 개체와 콤보 상자를 바인딩하지만, XAML 여기</p> <p>에서 인스턴스화 내 콤보입니다 생성자에 채워 사전에 뷰 모델에 해당하는 바인딩입니다 효과

private IDictionary<string,string> _delimiters; 

public IDictionary<string,string> Delimiters 
{ 
    get{return _delimiters;} 
    set{_delimiters = value; RaisePropertyChanged("Delimiters");} 
} 

private KeyValuePair <string, string> _selectedDelimiter; 
public KeyValuePair <string, string> SelectedDelimiter 
{ 
    get{return _selectedDelimiter;} 
    set{ 
     if(value.Key != _selectedDelimiter.Key || value.Value != _selectedDelimiter.Value) 
     { 
      var prevDelimiter = _selectedDelimiter; 
      _selectedDelimiter = value; 
      if(IllegalDelimiter.Contains(_selectedDelimiter) 
      { 
       MessageBox.Show("errror", "error"); 
       _selectedDelmiter = prevDelimiter; 
      } 
      RaisePropertyChanged("SelectedDelimiter"); 
     } 

    } 
} 

기본적으로 선택한 값을 다시 바인딩하는 데 문제가 있습니다. 사전 바인딩 된 점점 내가 UI 콤보 상자를 변경할 때 설정이 올바르게 발생시키는 것입니다. if 문에서 불법 구분 기호가 맞는지 여부를 확인하기 위해 선택한 값을 코드 배후의 원래 값으로 다시 설정하지만 콤보 상자에 채워지지 않습니다 (UI에서 get 접근자가 표시됨 참조). 그것의 likevalue 설정은 실제로 ui에 아무 것도하지 않습니다.

누군가 올바른 방향으로 나를 가리킬 수 있다면?

답변

1

상황을 올바르게 설정하고 있었지만 setter에서 동일한 속성을 업데이트했기 때문에 디스패처를 사용하여 올바르게 업데이트 할 새 스레드를 만들어야했습니다.

+0

나는 비슷한 것을 직면하고 있습니다. 기억한다면 "세터에서 같은 속성을 업데이트하는 것"이 ​​무엇을 의미하는지 알려 주실 수 있습니까? – Tany

3

SelectedValue (아마도 Value)을 사용하려는 경우 SelectedValuePath으로 설정해야합니다. SelectedValue이 "선택"을하고 있으므로 속성 유형도 달라야합니다.

KeyValuePair 전체를 유지하려면 SelectedItem을 대신 바인딩해야합니다.

+0

'SelectValuePath = Value'와 SelectedDelimiter를 char로 사용했지만, 변경하려고 시도했을 때 같은 동작을하게됩니다. 또한 SelectedItem에 대한 KvP 바인딩을 시도했습니다. 변경 없음. – Tim

+0

@Tim : 코드에서 실제로 속성을 설정 했습니까? 필드를 설정하면 알림이 제기되지 않으므로 바인딩이 업데이트되지 않습니다. –