0

我是WPF中的新手。我已經實現了一個M-V-VM解決方案,併爲所有需要反映在UI上的屬性實現INotifyPropertyChanged。到目前爲止,一切似乎都工作正常,除了綁定到只讀屬性的列表框,該屬性返回可觀察集合。即使在INotifyPropertyChanged上也不更新綁定列表框即使更新ObservableCollection

ViewModelBase實現INotifyPropertyChanged接口:

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    ..... 
    INotifyPropertyChanged Implementation 
    ..... 

    OnPropertyChanged(...) 
    { 
     ..... 
    } 
} 

MainViewModel類繼承ViewModelBase並保持爲UI(查看)中的數據。 BackgroundWorker創建UserViewModel對象。這些對象被添加到ObservableCollection中。 ListBox顯示UserViewModel ObservableCollection。

當創建User對象時,會將其添加到ObservableCollection中,並調用OnPropertyChanged以通知要刷新的UI元素。這工作正常。

當用戶選擇僅查看收藏夾時,將從視圖中刪除一個用戶項目。正在檢查&取消選中該複選框具有相同的效果...也就是說,用戶項目從列表視圖中刪除。雖然預期的行爲是在可觀察集合之間切換。

public class MainViewModel : ViewModelBase 
{  
    private ObservableCollection<UserViewModel> mUsers = new ObservableCollection<UserViewModel>(); 
    private ObservableCollection<UserViewModel> mFavoriteUsers = new ObservableCollection<UserViewModel>(); 
    UserViewModel mSelectedUser; 
    private bool mbShowFavorite; 

    public bool ShowFavorite 
    { 
     get { return this.mbShowFavorite; } 
     set 
     { 
      this.mbShowFavorite = value; 
      OnPropertyChanged("ShowFavorite"); 
      OnPropertyChanged("Users"); 
     } 
    } 

    public UserViewModel SelectedUser 
    { 
     get { return this.mSelectedUser; } 
     set 
     { 
      this.mSelectedUser = value; 
      OnPropertyChanged("SelectedUser"); 
     } 
    } 

    public ObservableCollection<UserViewModel> Users 
    { 
     get 
     { 
      if (this.mbShowFavorite) 
       return this.mFavoriteUsers; 
      else 
       return this.mUsers; 
     } 
    } 

    ..... 
    Other Class Members 
    ..... 

    void BackgroundCreateUserModelsCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // Add the User View Model 
     this.mUsers.Add((UserViewModel)e.Result); 

     if (((UserViewModel)e.Result).IsFavorite) 
     { 
      this.mFavoriteUsers.Add((UserViewModel)e.Result); 
     } 

     // Users changed: Notify Property Changes 
     OnPropertyChanged("Users"); 
    } 
} 

這是與上述代碼相關的XAML視圖。

<CheckBox VerticalAlignment="Center" Content="Show Favorites" 
    IsChecked="{Binding Path=ShowFavorite, Mode=TwoWay}" /> 

<ListBox Name="listboxUsers" 
    ItemsSource="{Binding Path=Users}" 
    SelectedItem="{Binding SelectedUser, Mode=TwoWay}">    
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <views:UserView></views:UserView> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox>  

我的問題是,我如何得到這個工作。我需要根據是否選中「收藏夾」複選框來交換視圖。

回答

0

該問題可能與未整理到UI線程的集合更改有關。有關更多信息,請參閱Making sure OnPropertyChanged() is called on UI thread in MVVM WPF app

+0

感謝您的回覆......但不幸的是,這並沒有幫助。 OnPropertyChanged()在UI線程中被調用。這就是清單首先顯示的方式。問題是在集合之間切換。在切換集合時,列表項逐一消失。 – Gaurav

+0

是否可以上傳複製問題的源代碼? – devdigital

+0

你好,謝謝你的跟進。我試圖創建一個示例項目來複制問題。但同樣的事情在那個項目中起作用。我可能在我的實際項目中缺少一些東西。順便提一下,以下是供您參考的示例:http://db.tt/pQdrSzO – Gaurav

相關問題