WPF如何将窗口UserControl中ListView选中对象传到另一窗口的UserControl
选中对象从UC1传递到UC2的实现方案
以下是3种不同场景下的常用实现方式:
方法1:事件订阅(低耦合首选)
适合没有引入MVVM框架的常规项目,不会让控件之间产生强依赖:
- 首先在UC1中定义选中项传递事件,绑定ListView的选中变更事件触发回调:
// UC1.xaml.cs // 替换YourBusinessObject为你实际的业务对象类型 public event Action<YourBusinessObject> OnItemClicked; private void TargetListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count == 0) return; if (e.AddedItems[0] is YourBusinessObject selectedItem) { OnItemClicked?.Invoke(selectedItem); } }
- 然后在承载UC1的第一个窗口中,订阅UC1的
OnItemClicked事件,触发时创建第二个窗口并传递数据到UC2:
// 承载UC1的窗口后台代码 public MainWindow() { InitializeComponent(); // 这里的Uc1Instance是你在窗口XAML中命名的UC1实例名称 Uc1Instance.OnItemClicked += OpenDetailWindow; } private void OpenDetailWindow(YourBusinessObject selectedItem) { var detailWindow = new DetailWindow(); // 提前给UC2定义数据绑定方法,将选中对象传入 detailWindow.Uc2Instance.SetDataSource(selectedItem); detailWindow.Show(); }
- 最后在UC2中实现接收数据的方法,绑定到前端控件展示完整信息:
// UC2.xaml.cs public void SetDataSource(YourBusinessObject item) { // 直接赋值给DataContext,前端用Binding绑定对应字段即可 DataContext = item; }
方法2:MVVM模式共享ViewModel
如果项目已经使用MVVM架构,可直接通过ViewModel传递数据:
- 在UC1对应的ViewModel中新增
SelectedItem依赖属性,双向绑定到ListView的SelectedItem属性 - 打开详情窗口的Command执行时,将
SelectedItem作为参数传递给UC2的ViewModel,UC2直接绑定ViewModel的属性展示信息即可
方法3:构造函数传参(小型项目快速实现)
对项目耦合度要求不高的场景可以用这种最简方式:
- 给UC2新增带参数的构造函数:
// UC2.xaml.cs public UC2(YourBusinessObject selectedItem) { InitializeComponent(); DataContext = selectedItem; }
- 在UC1的选中事件中直接传递参数创建UC2实例,放到第二个窗口中展示即可
注意:如果需要UC2中修改对象后同步更新UC1的列表展示,直接传递引用类型的业务对象即可自动同步,值类型对象需要额外做同步逻辑。
内容的提问来源于stack exchange,提问作者Khaled Ayman
相关产品推荐
相关产品推荐

