WPF&MVVM应用中<ListViewItem>未在<ListView>显示的问题排查
问题根源与解决方案
核心问题
你代码里的致命错误是**AddContact窗口构造函数中新建了一个全新的MainWindow实例**,而非引用当前正在显示的主窗口。这导致你添加的联系人被放到了新实例的集合中,而非绑定到ListView的那个集合,自然无法在界面上显示。
修正步骤
1. 修改AddContact窗口的构造函数
将构造函数改为接收现有主窗口实例作为参数,放弃新建主窗口的逻辑:
public partial class AddContact : System.Windows.Window { private readonly MainWindow _mainWindow; // 构造函数接收当前主窗口实例 public AddContact(MainWindow mainWindow) { InitializeComponent(); _mainWindow = mainWindow; // 若弹窗无需绑定自身DataContext,可删除此行;若需要保留,请确保逻辑符合你的需求 // DataContext = this; } int st = 1; private void AddNewContactBtn_Click(object sender, RoutedEventArgs e) { string username = this.contactUsername.Text; string imageUrl = this.contactImageURL.Text; ContactModel newContact = new ContactModel { Username = "Nixt", ImageSource = "https://www.dictionary.com/e/wp-content/uploads/2018/04/Sid-the-Sloth-300x300.jpg", Messages = new ObservableCollection<MessageModel>(new List<MessageModel> { new MessageModel { FirstMessage = true, ImageSource = "https://www.dictionary.com/e/wp-content/uploads/2018/04/Sid-the-Sloth-300x300.jpg", Message = $"Sporočilo {st + 1}", Username = "Nixt", UsernameColor = "Red" }, new MessageModel { Username = "Nixt", UsernameColor = "Red", FirstMessage = false, ImageSource = "https://www.dictionary.com/e/wp-content/uploads/2018/04/Sid-the-Sloth-300x300.jpg", Message = $"Sporočilo {st + 2} ", Time = DateTime.Now }, new MessageModel { Username = "povodnikt", UsernameColor = "#409AFF", ImageSource = "https://imgur.com/FeMHSd6.jpg", Message = $"Zdravo? {st + 3}", Time = DateTime.Now }, new MessageModel { Username = "povodnikt", UsernameColor = "#409AFF", ImageSource = "https://imgur.com/FeMHSd6.jpg", Message = $"Adijo frend! {st}", Time = DateTime.Now } }) }; _mainWindow.AddNewContactToCollection(newContact); } }
2. 修改主窗口中弹出AddContact的逻辑
在主窗口点击“添加”菜单时,传入当前主窗口的实例:
// 示例:点击"添加联系人"菜单的事件处理程序 private void AddContactMenu_Click(object sender, RoutedEventArgs e) { var addContactWindow = new AddContact(this); // 传入当前主窗口实例 addContactWindow.ShowDialog(); }
额外检查点
- 确认
viewModel2.Contacts是ObservableCollection<ContactModel>类型(只有该集合在元素增删时会自动通知UI更新,普通List不具备此特性)。 - 检查ListView的
ItemsSource是否正确绑定到viewModel2.Contacts,确保绑定路径无误。
内容的提问来源于stack exchange,提问作者AquaBalls
相关产品推荐
相关产品推荐

