c# - 如何在无模式 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"); 例如。
解决方案
如果您想使用“最佳实践”在 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 更容易,并且具有您尝试做的功能(发送到父视图的链接等)
推荐阅读
- powershell - OneDrive FB 使用 Microsoft Graph API Powershell 创建文件夹
- python - 在python中验证分数
- spring-webflux - 有没有办法在 Mono.zip 中提供事务回滚?
- python - 如何使用 python opencv 重建扭曲和像素化的图像进行人脸识别
- unity3d - Unity 2D Animations:如何同时实现跳跃+射击?
- r - 为什么在线性混合效应模型的某些级别上有如此大的自由度?
- python - 带 noip 的 Cherrypy
- c# - EF核心与现有数据的一对多关系
- google-cloud-functions - 在 Terraform 中使用 cloud run 部署云端点服务时如何解决循环依赖关系
- powershell - 在 RDP 自动化期间未能将 ok 发送到法律通知横幅