代码之家  ›  专栏  ›  技术社区  ›  PVitt

通过MVVM绑定的observatecollection<T>不会更新视图

  •  1
  • PVitt  · 技术社区  · 14 年前

    我有以下简化的视图模型

    public class UserViewModel : IUserViewModel
    {
        public DelegateCommand<object> NewUser { get; private set; }
    
        public ObservableCollection<UserInfo> UserList { get; set; }
    
        public UserViewModel( ) {
            NewUser = new DelegateCommand<object>( OnNewUser );
    
            this.UserList = new ObservableCollection<UserInfo>( );
            UserList.Add( new UserInfo( "Peter" );
            UserList.Add( new UserInfo( "Paul" );
            UserList.Add( new UserInfo( "Mary" );
        }
    
        private void OnNewUser( object parameter ) {
            UserInfo user = new UserInfo( "User"+DateTime.Now.ToLongTimeString(), 0, true, false, false );
            UserList.Add( user );
        }
    }
    

    此视图模型是(简化)视图的数据上下文:

    public partial class UserView : ViewBase
    {
        public UserView( UserViewModel viewModel ) {
        InitializeComponent( );
    
        this.DataContext = viewModel;
        }
    }
    

    视图本身包含一个绑定到用户视图模型的用户列表的列表框:

    <ListBox ItemsSource="{Binding UserList}" DisplayMemberPath="UserID" />
    

    viewModel.UserList.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler( UserList_CollectionChanged );
    

    [编辑]

    public class UserButtonBarViewModel : IUserButtonBarViewModel
    {
    
        public UserButtonBarViewModel( IUserButtonBarView view, IUserViewModel mainModel ) {
            this.View = view;
            NewUser = mainModel.NewUser;
            this.View.Model = this;
        }
    
        public ICommand NewUser { get; private set; }
    
        public IUserButtonBarView View {get; private set; }
    }
    

    <UserControl ...>
        <Button Command="{Binding NewUser}" Content="New user"/>
    </UserControl>
    

    以及视图背后的代码:

    public partial class UserButtonBarView : IUserButtonBarView
    {
    
        public UserButtonBarView( ) {
            InitializeComponent( );
        }
    
        public IUserButtonBarViewModel Model {
            get {
                return DataContext as IUserButtonBarViewModel;
            }
            set {
                DataContext = value;
            }
        }
    }
    

    为什么不调用视图的处理程序?为什么列表框在视图模型中的集合更改时不更新自身?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Rachel    14 年前

    听起来好像您正在某处创建ViewModel的第二个副本(可能在您的ButtonViewModel中),而NewUser按钮正在将用户添加到一个副本,而ListBox仍绑定到另一个副本。

    你能发布你的新用户命令代码吗?

        2
  •  0
  •   rudigrobler    14 年前

    你能发布实际添加新用户的代码吗? 似乎它可能发生在与UI不同的线程上?尝试使用Dispatcher.Invoke。。。

        3
  •  0
  •   JSprang    14 年前

    我想你需要用双向装订。

    <ListBox ItemsSource="{Binding UserList, Mode=TwoWay}" DisplayMemberPath="UserID" />
    
        4
  •  0
  •   Gary Evans    14 年前

    推荐文章