2014-02-11 4 views
3

ListSubs, ComboBox 등의 ItemsSource 속성이 내 뷰 모델의 관찰 가능한 컬렉션에 바인딩 된 컨테이너가 있습니다. 내 VM의 일부 메서드를 통해 컬렉션에서 항목을 추가/제거하려고하면 UI에 반영되지 않습니다. UI를 실제로 새로 고치는 유일한 방법은 컬렉션에 새 값을 할당하는 것입니다 (즉, 다른 관련 데이터와 함께 수집) 전체 컬렉션을 재 바인딩하도록 강요합니다.WPF MVVM ListBox/ComboBox ItemsSource는 ViewModel에서 UI를 업데이트하지 않습니다.

어쩌면 내가 누락되었거나 컬렉션 바인딩 문제에 대해 이해할 수 없다. 누군가가 해결책을 갖고 있거나 좋은 설명이 있다면/둘 다 좋을 것이다.

private ObservableCollection<ScheduledRecordingObject> m_PreSavedRecordingScheduleList; 

PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>(); 

public ObservableCollection<ScheduledRecordingObject> PreSavedRecordingScheduleList 
     { 
      get 
      { 
       return m_PreSavedRecordingScheduleList; 
      } 
      set 
      { 
       m_PreSavedRecordingScheduleList = value; 
       OnPropertyChanged("PreSavedRecordingScheduleList"); 
      } 
     } 

ScheduledRecordingObject도에서 INotifyPropertyChanged 구현합니다 여기 내보기에서 샘플 (이 경우 그 목록 상자) 여기

<ListBox 
       Grid.Row="9" 
       Grid.Column="1" 
       Grid.ColumnSpan="3" 
       Width="200" 
       Height="200" 
       ItemsSource="{Binding PreSavedRecordingScheduleList,UpdateSourceTrigger=PropertyChanged}" 
       SelectedItem="{Binding SelectedPreSavedRecordingSchedule,UpdateSourceTrigger=PropertyChanged}" 
       DisplayMemberPath="Display"/> 

내 뷰 모델이입니다.

public ObservableCollection<yourType> MyItemsSource {get;set} 

+2

더 나은 이해를 위해 지금까지 코드 시도를 – Sheridan

+0

표시 - 컬렉션의 초기 값이 목록 상자에 표시됩니까? – blindmeis

+0

예, 초기 값이 표시됩니다. 예를 들어 C'tor에 몇 가지 항목을 추가하면 사용자가 볼 수 있지만 UI 변경 후 추가/제거/삭제 등의 작업을 수행하면 어떤 변화가 생길 수 있습니까? – user1531186

답변

0

뷰 모델은 생성자에 한 번 초기화하고, 명확 사용 추가

<ListBox ItemsSource="{Binding MyItemsSource}"/> 

그냥 바로 DataContext를 설정되어 있는지 확인이

보기 변경 제거합니다. 이 코드에서 볼 방법을

그게

편집 : 당신의 게시 된 코드 몇 가지 힌트 :

모든 코드에
//remove the UpdateSourceTrigger=PropertyChanged - makes no sense the Mode is OneWay anyway :) 
ItemsSource="{Binding PreSavedRecordingScheduleList}" 

//the following line should just called once and at best in ctor 
//but the binding will of course work too when you assign a new collection 
PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>(); 

모두가 좋아 보인다, 그리고 뷰 모델은의 데이터 컨텍스트 인 경우 목록 상자가 작동해야합니다. 스눕이 보여주고있는 것이 무엇인지 알려주세요 :)

+0

고마워요. 이미 그것을 시도해 보았습니다. 컬렉션을 변경하기 위해 클리어/추가/제거를 사용한다고 말한 부분이 작동하지 않습니다. – user1531186

+0

pls는 런타임에 스누핑을 사용하여 초기 바인딩이 손상되었는지 확인합니다. 그리고 pls 일부 코드 게시 – blindmeis

+0

이 같은 도구를 몰랐어 지금까지 존재하지, 그래서 난 그냥 그것을 다운로드하고 그것을 시도 할거야. – user1531186

0

OnPropertyChanged ("PreSavedRecordingScheduleList"); ObservableCollection에서. 실제로 당신은 뒷받침 필드가 필요하지 않습니다. 뷰 모델 생성자 내부이

1과 같은 ObservableCollection에에 CollectionChanged 이벤트를 부착, 뭔가 이벤트가 이벤트 처리기에서 OnPropertyChanged를 ("PreSavedRecordingScheduleList")를 주입

PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>(); 

PreSavedRecordingScheduleList.CollectionChanged += PreSavedRecordingScheduleList_CollectionChanged; 

2- CollectionChanged 첨부

void PreSavedRecordingScheduleList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     OnPropertyChanged("PreSavedRecordingScheduleList"); 
    }