2014-10-29 3 views
2

나는 SelectedItem과 콤보 박스를 가지고있다. 항목을 선택하면 설정자가 일부 계산을 수행하고 값을 이전 값으로 다시 설정하려고합니다. 불행히도 내 견해는 상쾌하지 않습니다.내 C# ComboBox는 항목을 선택한 후에 getter를 호출하지 않습니다. 왜?

나는 다음과 같은 콤보가 : 여기

<ComboBox BorderThickness="0" VerticalAlignment="Center" Margin="2,0" 
    DisplayMemberPath="Name" 
    ItemsSource="{Binding ItemsVS.View}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" > 

</ComboBox> 

내 뷰 모델의 재산을 :

private CollectionViewSource _itemsVS; 
public CollectionViewSource ItemsVS 
{ 
    get { return _itemsVS; } 
    set 
    { 
     _itemsVS = value; 
     if(PropertyChanged!=null) 
      PropertyChanged(this, new PropertyChangedEventArgs("ItemsVS")); 
    } 
} 


private ItemViewModel _selectedItem; 
public ItemViewModel SelectedItem 
{ 
    get 
    { 
     // after setting the old value in the setter the getter is not called 
     // and the view is not refreshed 
     return _selectedItem; 
    } 
    set 
    { 
     var old = _selectedItem; 
     _selectedItem = value; 
     // After some logic I want to have the old value!!!!!!!!!!!!!! 
     _selectedItem = old; 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); 


    } 
} 
+1

'PropertyChanged', 무슨 새로 고침입니까? 아무것도 변하지 않았다. –

+0

WPF 또는 ASP 또는 기타로 질문에 태그를 답니다. !! – TaW

+0

@BenRobinson 실제 주제는 좀 더 복잡합니다. 아마도 나는 "가치"도 "오래된"것도 설정하고 싶지 않습니다. – koalabruder

답변

2

당신이 ComboBox가 새 값을 설정 한 후 현재 값을 다시 읽어 확인하려면 실제로 아무 것도하지 않는 Binding에 "no op"Converter을 추가해야합니다. 바인딩은 일반적으로 바인딩에 의해 제공된 새 값과 실제로 적용된 소스 값이 일치하는지 여부를 확인하지 않기 때문에 유용한 작은 트릭입니다. 변환기를 추가하면 강제로 확인합니다. 당신은 당신이 전화하기 전에 원래 값의에 다시 속성을 설정하면

public sealed class NoOpConverter : IValueConverter 
{ 
    public static readonly NoOpConverter Instance = new NoOpConverter(); 

    public object Convert(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     return value; 
    } 

    public object ConvertBack(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     return value; 
    } 
} 
<ComboBox SelectedItem="{Binding Path=SelectedItem, 
           Mode=TwoWay, 
           Converter={x:Static NoOpConverter.Instance}}" 
      ... /> 
+0

나는이 대답을 좋아하지만 땅콩 갤러리에서 명확한 설명을 원합니다 : 바인딩은 속성 getter가 항상 setter로 전달 된 내용을 정확히 반환한다고 가정하고 있으며 특히 PropertyChanged 이벤트는 세터가 모금 중입니까? –

+1

소스 값에 대한'PropertyChanged' 이벤트는 소스 값을 업데이트 할 때 * 발생한 경우 무시됩니다. * 값을 설정하는 동안 이벤트가 발생하기 때문입니다 (결국 값을 변경하는 것입니다). 그러나 예, 바인딩은 제공하는 값에 대한 새 값을 대체하지 않을 것이라고 가정하기 때문에이 동작은 순진합니다. WPF 4.5에서는 소스 값을 업데이트 한 후에 항상 읽혀지는 동작을 변경했다고 생각하지만 호환성을 위해이 해결 방법을 사용해야합니다. –

관련 문제