gpt4 book ai didi

wpf - 通过 MVVM 绑定(bind)的 ObservableCollection 不会更新 View

转载 作者:行者123 更新时间:2023-12-03 10:24:38 25 4
gpt4 key购买 nike

我有以下简化的 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 );
}
}

此 View 模型是(简化) View 的数据上下文:
public partial class UserView : ViewBase
{
public UserView( UserViewModel viewModel ) {
InitializeComponent( );

this.DataContext = viewModel;
}
}

View 本身包含一个绑定(bind)到 UserViewModel 的 UserList 的 ListBox:
<ListBox ItemsSource="{Binding UserList}" DisplayMemberPath="UserID" />

初始化 View 模型时,它会将用户添加到列表中。该用户显示在列表框中。之后调用 NewCommand 时,会将新用户添加到列表中。但是列表框不会随新用户一起更新。

我向 View 模型和 View 添加了一个 CollectionChanged 处理程序。 View 处理程序被添加到构造函数中,如下所示:
viewModel.UserList.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler( UserList_CollectionChanged );

[编辑]

将新用户添加到集合的命令由来自不同 View 的按钮触发:
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>

以及背后的 View 代码:
public partial class UserButtonBarView : IUserButtonBarView
{

public UserButtonBarView( ) {
InitializeComponent( );
}

public IUserButtonBarViewModel Model {
get {
return DataContext as IUserButtonBarViewModel;
}
set {
DataContext = value;
}
}
}

[/编辑]

有趣的一点是, View 模型中的处理程序是在将新用户添加到集合时执行的,但 View 的处理程序没有被调用。

为什么 View 的处理程序也没有被调用?当 View 模型中的集合发生变化时,为什么列表框不会自行更新?

最佳答案

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

您可以发布您的 NewUser 命令代码吗?

关于wpf - 通过 MVVM 绑定(bind)的 ObservableCollection<T> 不会更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com