首页 > 解决方案 > 如何在无模式 WPF 应用程序窗口中立即将子数据发送给父级

问题描述

使用 VS2019 - WPF 应用程序:我的目标是通过编辑无模式子窗口文本框来实时更新父窗口列表框,这可能吗?

想象一个应用程序有一个用户列表,您可以在其中添加、删除、编辑和查看。添加和编辑通过一个模式窗口使用不同的方法工作。View 必须是无模式窗口(所以我创建了另一个类),并且它必须对 ListBox 中的用户数据进行实时更新。

主窗口.cs:

public UserDlg userDlg; //modal window (it has OK/cancel buttons)
public UserView userView; //modeless window (it has only Close button)
public List<User> users = new List<User>(); // a distinct user class that also has a method .getUser() that prints user data to String.

private void View(object sender, RoutedEventArgs e) { //view button
        userView.Show();
        userView.openEdition(users[sel].fName, users[sel].lName, users[sel].eMail);// it passes ListBox selected user data to new window (works)
        }

private void UsersList_SelectionChanged(object sender, SelectionChangedEventArgs e){ //ListBox changes here

        ...if (userView != null && userView.IsVisible)
            {
                userView.openEdition(users[sel].fName, users[sel].lName, users[sel].eMail); // this updates selection in modeless window (works)
            }

用户视图.cs:

public void FName1_TextChanged(object sender, TextChangedEventArgs e)
        {
            Console.WriteLine(fName1.Text + " / " + lName1.Text + " / " + eMail1.Text); //this part is to show me that every character written/removed works fine
            user.setUserData(getFirstName(), getLastName(), getMailAddress());
            string dataToPass = user.getUser(); // - here I tried with RoutedEventHandler (something I found on web) but I managed to only send preinitialized string with a button - not a real-time text changed from textbox
        }
public void openEdition(string fName, string lName, string eMail)
        {
            user = new User(fName, lName, eMail);
            fName1.Text = fName;
            lName1.Text = lName;
            eMail1.Text = eMail;
        }

我希望通过更改无模式子项中的文本框来实时更改父项中的数据..有什么想法吗?

编辑:我猜我使用了 Java 中的(一些错误的)知识。我想用 MainWindow 窗口作为参数创建 UserView .. 作为父级,它有效,我相信它以某种方式解决了我的问题?- 立即测试(希望 10-15 分钟后返回。)>> UserView.cs:

MainWindow window;
public UserView(MainWindow window){ this.window = window; ... }

现在我可以简单地调用 window.usersList.Items.Add("Test"); 例如。

标签: c#wpfmodeless

解决方案


如果您想使用“最佳实践”在 WPF 上创建应用程序,那么您需要阅读有关 WPF 上的 MVVM 的信息。

但是在这种情况下,您需要了解 (DataContext, ItemsSource),因为在 WPF 上,数据在大多数情况下是由绑定和 ViewModel 移动的。

1方法。- 使用绑定到通用 ViewModel。

在此处输入图像描述

更新

如果您的 ViewParent 绑定到 ViewModel 上的字段并且 ViewChild 绑定到 ViewModel,那么如果您更改 ViewParent 中的数据,那么 ViewModel 中的数据将发生更改,并且 ViewChild 上的数据也会更改(因为它绑定到 ViewModel)

2方法

绑定到另一个视图。它与上面的绑定类似,但是您创建了与 View 和 View 上的字段的绑定。

关键词:绑定、数据绑定、mvvm、INPC。

良好的链接。我认为它对你有帮助 MVVM:从头到尾的教程?

编辑(更新):它在 wpf 上的错误位置。如果您不使用绑定,则将 wpf 转换为 winforms,并为自己关闭 90% 的 WPF 功能。

您可以为此使用 WinForms,它比 wpf 更容易,并且具有您尝试做的功能(发送到父视图的链接等)


推荐阅读