WPF中双击Window2的DataGrid将选中值传递至主窗口的实现方案
实现WPF窗口间选中数据传递的方案
以下是基于你提供的代码修改后的具体实现步骤:
1. 调整Window2的代码
给Window2添加一个公共属性来存储用户选中的数据,同时简化双击事件的逻辑:
public class Window2 : Window { // 新增公共属性,用于存储选中的用户数据 public User SelectedUser { get; private set; } // 构造函数,接收要展示的数据源 public Window2(IEnumerable<User> dataToRetrieve) { InitializeComponent(); // 给DataGrid绑定数据源(假设你的DataGrid控件名为dataGrid) dataGrid.ItemsSource = dataToRetrieve; } private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { // 直接获取选中的User对象(如果DataGrid绑定的是强类型User集合) if (sender is DataGrid grid && grid.SelectedItem is User selectedUser) { SelectedUser = selectedUser; // 关闭当前窗口 this.Close(); } } }
注意:如果你的DataGrid绑定的是
DataTable而非直接的User集合,才需要使用DataRowView转换;若绑定的是ObservableCollection<User>这类强类型集合,直接转换SelectedItem即可,无需通过DataGridRow获取。
2. 修改主窗口的按钮点击事件
在ShowDialog()调用完成后,直接读取Window2的公共属性,将数据填充到文本框:
// 修正事件参数:按钮点击事件的参数应为RoutedEventArgs而非KeyEventArgs private void Button_Click(object sender, RoutedEventArgs e) { Window2 window = new Window2(DataToRetrieve); window.ShowDialog(); // 读取选中数据并填充文本框 if (window.SelectedUser != null) { firstNameTextBox.Text = window.SelectedUser.FirstName; lastNameTextBox.Text = window.SelectedUser.LastName; } }
可选方案:通过自定义事件传递数据
如果不想使用公共属性,也可以通过自定义事件实现数据传递:
- 在Window2中定义自定义事件:
public class Window2 : Window { // 定义自定义事件,用于传递选中的User数据 public event EventHandler<User> UserSelected; public Window2(IEnumerable<User> dataToRetrieve) { InitializeComponent(); dataGrid.ItemsSource = dataToRetrieve; } private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (sender is DataGrid grid && grid.SelectedItem is User selectedUser) { // 触发事件传递数据 UserSelected?.Invoke(this, selectedUser); this.Close(); } } }
- 主窗口订阅事件并接收数据:
private void Button_Click(object sender, RoutedEventArgs e) { Window2 window = new Window2(DataToRetrieve); // 订阅自定义事件 window.UserSelected += Window2_UserSelected; window.ShowDialog(); } private void Window2_UserSelected(object sender, User selectedUser) { firstNameTextBox.Text = selectedUser.FirstName; lastNameTextBox.Text = selectedUser.LastName; }
内容的提问来源于stack exchange,提问作者ISeeMangos
相关产品推荐
相关产品推荐

