即使在INotifyPropertyChanged上,绑定ListBox也不会更新ObservableCollection

时间:2011-07-27 04:28:28

标签: mvvm binding observablecollection inotifypropertychanged swap

我是WPF的新手。我已经实现了一个M-V-VM解决方案,并为需要在UI上反映的所有属性实现了INotifyPropertyChanged。到目前为止,一切似乎都运行正常,除了绑定到只读属性的列表框,它返回一个可观察的集合。

ViewModelBase实现了INotifyPropertyChanged接口:

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

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

MainViewModel类继承ViewModelBase并保存UI(View)的数据。 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>    

我的问题是,我该如何让它发挥作用。我需要根据是否选中收藏夹复选框来交换视图。

1 个答案:

答案 0 :(得分:0)

问题可能与未被编组到UI线程的集合更改有关。有关详细信息,请参阅Making sure OnPropertyChanged() is called on UI thread in MVVM WPF app