WPF中如何填充外部View/UserControl内的DataGrid?
解决WPF中UserControl内DataGrid的数据填充问题
快速临时方案(不推荐长期使用)
要是你想先快速跑通效果,可以在OrderCatalogView里加个公开方法来设置数据:
- 先在
OrderCatalogView.xaml里给DataGrid起个名字:
<DataGrid x:Name="OrderDataGrid" AutoGenerateColumns="True" />
- 打开
OrderCatalogView.xaml.cs,写个公开方法:
public void LoadOrderData(IEnumerable<YourOrderModel> orderList) { OrderDataGrid.ItemsSource = orderList; }
注意:把YourOrderModel换成你实际的订单数据类
- 回到
MainWindow.xaml,给你的UserControl也起个名字:
<local:OrderCatalogView x:Name="OrderCatalogUC" />
- 最后在
MainWindow.xaml.cs里调用这个方法传数据:
// 先构造你的订单数据 var sampleOrders = new List<YourOrderModel> { new YourOrderModel { Id = 1, Customer = "张三", OrderDate = DateTime.Now }, new YourOrderModel { Id = 2, Customer = "李四", OrderDate = DateTime.Now.AddDays(-1) } }; // 调用UserControl的方法填充数据 OrderCatalogUC.LoadOrderData(sampleOrders);
推荐的MVVM方案(WPF标准玩法)
直接操作控件是WPF的反模式,耦合性太高,后续改代码会很头疼。推荐用MVVM模式,把数据和UI分开:
- 先写个订单数据模型
Order.cs:
public class Order { public int Id { get; set; } public string Customer { get; set; } public DateTime OrderDate { get; set; } // 按需添加其他属性 }
- 写个视图模型
OrderCatalogViewModel.cs,要实现INotifyPropertyChanged(用来通知UI数据更新):
using System.Collections.ObjectModel; using System.ComponentModel; public class OrderCatalogViewModel : INotifyPropertyChanged { // 用ObservableCollection,数据变化时UI会自动更新 private ObservableCollection<Order> _orders; public ObservableCollection<Order> Orders { get => _orders; set { _orders = value; OnPropertyChanged(nameof(Orders)); } } public OrderCatalogViewModel() { // 初始化数据,也可以从数据库/接口拉取 Orders = new ObservableCollection<Order> { new Order { Id = 1, Customer = "张三", OrderDate = DateTime.Now }, new Order { Id = 2, Customer = "李四", OrderDate = DateTime.Now.AddDays(-1) } }; } // 实现INotifyPropertyChanged的必要代码 public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } }
- 在
OrderCatalogView.xaml里把DataGrid绑定到视图模型的Orders:
<!-- 先给UserControl设置DataContext --> <UserControl.DataContext> <local:OrderCatalogViewModel /> </UserControl.DataContext> <!-- DataGrid绑定数据源 --> <DataGrid ItemsSource="{Binding Orders}" AutoGenerateColumns="True" />
- 要是需要从MainWindow给UserControl传数据,直接在MainWindow里实例化视图模型,再赋值给UserControl的DataContext就行:
// MainWindow.xaml.cs里 var vm = new OrderCatalogViewModel(); // 可以在这里给vm.Orders添加数据或者修改数据 OrderCatalogUC.DataContext = vm;
这样做的好处是UI和数据逻辑完全分离,以后改数据逻辑不用碰UI,改UI也不用动数据代码,维护起来轻松太多。
内容的提问来源于stack exchange,提问作者aimen
相关产品推荐
相关产品推荐

