2011-08-10 2 views
0

WPF와 MVVM 패턴을 사용하고 있습니다. 목록에 바인딩 된 모든 콤보 상자가 제대로 작동하지만 필터링을 위해 CollectionViewSource을 사용하는 계단식 드롭 다운이 있습니다. 세터 (대답을 검색하는 동안 문제가있는 다른 사람을 보았을 때)와 마찬가지로 필터링이 작동하지만 초기 값을 설정할 수 없습니다. 나는 몇 가지 방법을 시도했지만 아무도 선택한 항목에 영향을주는 것 같지 않습니다.CollectionViewSource에 바인딩 된 Combobox의 초기 값을 설정하십시오.

뷰 모델의 ctor에, 및 속성 세터 (_ticket.SelectedSubstatus이 모델 생성자에서 설정) : 여기

public TicketViewModel() 
    { 
     _ticket = new TicketModel(); 
     SubstatusList = CollectionViewSource.GetDefaultView(GetStatusList()); 
     SubstatusList.Filter = (x) => { return (int)(x as Substatus).IST_MAIN_STATUS == (int)SelectedStatus.IST_STATUS_ID; }; 

     SubstatusList.MoveCurrentTo(_ticket.SelectedSubstatus); 
     SelectedSubstatus = _ticket.SelectedSubstatus; 

     Substatus test = (Substatus)SubstatusList.CurrentItem; 

    } 

public Substatus SelectedSubstatus 
    { 
     get { return _ticket.SelectedSubstatus; } 
     set 
     { 
      if (value == _ticket.SelectedSubstatus ||value == null) 
       return; 

      _ticket.SelectedSubstatus = value; 
      _ticket.Issue.IS_SUBSTATUS_ID = value.IST_SUBSTATUS_ID; 

      base.OnPropertyChanged("SelectedSubstatus"); 
     } 
    } 

<ComboBox HorizontalAlignment="Stretch" Margin="15,0,0,0" 
            Name="comboBox1" VerticalAlignment="Bottom" 
            Grid.Column="2" Grid.Row="1" FontSize="12" 
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding Path=SubstatusList}" 
            SelectedItem="{Binding Path=SelectedSubstatus, Mode=TwoWay}" 
            DisplayMemberPath="IST_NAME"/> 

CollectionViewSource에서 현재 항목이 null 콤보 상자 XAML입니다 MoveCurrentTo()로 설정 한 직후 및 테스트로 선택했을 때. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

1

기본적으로 개체는 값이 아닌 참조로 동일하면 검사됩니다. 당신이 극복하려면 SubstatusList

에 존재하지 않는 항목과 동일하게 SelectedSubstatus을 설정하려고하기 때문에

그래서 _ticket.SelectedSubstatus 경우 직접 SubstatusList의 항목을 참조하지 않습니다, 다음 SelectedSubstatus는 NULL이됩니다 .Equals() 메서드를 Substatus으로 덮어 쓰면 개체의 데이터가 동일하면 true를 반환합니다. 예 :

public override bool Equals(object obj) 
{ 
     if (obj == null) return false; 
     if (obj.GetType() != this.GetType()) return false; 

     return this.Id == ((SubStatus)obj).Id; 
} 
+0

당신은 그것을 가지고 있습니다. 'SelectedSubstatus'는 null이 아니며 드롭 다운을 선택하면'SelectedSubstatus'가 제대로 업데이트됩니다. 이것이 맞는 것이라고 생각하지만,'SubstatusList.MoveCurrentTo (_ticket.SelectedSubstatus);'가'SubstatusList'에서 객체를 찾을 수 없다면 설정하지 않을 것입니다. SubstatusList에서 CurrentItem을 어떻게 설정할 수 있습니까? – Tyrsius

+0

또한 하위 상태는 EF4 개체입니다. 부분 클래스에 해당 재정의 배치를 시도했지만 'ID'는 유효한 속성이 아닙니다. 나는 Intellisense에서 작동했을만한 것을 보지 못했습니다. – Tyrsius

+0

'SubStatus' 클래스에서'Equals()'를 덮어 쓰면 데이터가 같으면 true를 반환합니다. 지금 메모리에서의 참조가 동일하다면 참일 수 있습니다. Id 속성이 예제입니다. – Rachel