【发布时间】:2010-10-15 11:40:29
【问题描述】:
我有以下简化的 ViewModel
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;
}
}
视图本身包含一个绑定到 UserViewModel 的 UserList 的 ListBox:
<ListBox ItemsSource="{Binding UserList}" DisplayMemberPath="UserID" />
初始化视图模型时,它会将用户添加到列表中。该用户显示在列表框中。之后调用 NewCommand 时,会将新用户添加到列表中。但是列表框不会随新用户一起更新。
我向视图模型和视图添加了一个 CollectionChanged 处理程序。视图处理程序被添加到构造函数中,如下所示:
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; }
}
UserButtonBarView 如下所示:
<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;
}
}
}
[/编辑]
有趣的是,视图模型中的处理程序是在将新用户添加到集合时执行的,但视图的处理程序没有被调用。
为什么视图的处理程序也没有被调用?当视图模型中的集合发生变化时,为什么列表框没有自行更新?
【问题讨论】:
-
你能贴出实际添加新用户的代码吗?
标签: wpf mvvm binding observablecollection