You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:01:13