You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中如何填充外部View/UserControl内的DataGrid?

解决WPF中UserControl内DataGrid的数据填充问题

快速临时方案(不推荐长期使用)

要是你想先快速跑通效果,可以在OrderCatalogView里加个公开方法来设置数据:

  1. 先在OrderCatalogView.xaml里给DataGrid起个名字:
<DataGrid x:Name="OrderDataGrid" AutoGenerateColumns="True" />
  1. 打开OrderCatalogView.xaml.cs,写个公开方法:
public void LoadOrderData(IEnumerable<YourOrderModel> orderList)
{
    OrderDataGrid.ItemsSource = orderList;
}

注意:把YourOrderModel换成你实际的订单数据类

  1. 回到MainWindow.xaml,给你的UserControl也起个名字:
<local:OrderCatalogView x:Name="OrderCatalogUC" />
  1. 最后在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分开:

  1. 先写个订单数据模型Order.cs:
public class Order
{
    public int Id { get; set; }
    public string Customer { get; set; }
    public DateTime OrderDate { get; set; }
    // 按需添加其他属性
}
  1. 写个视图模型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));
    }
}
  1. 在OrderCatalogView.xaml里把DataGrid绑定到视图模型的Orders:
<!-- 先给UserControl设置DataContext -->
<UserControl.DataContext>
    <local:OrderCatalogViewModel />
</UserControl.DataContext>

<!-- DataGrid绑定数据源 -->
<DataGrid ItemsSource="{Binding Orders}" AutoGenerateColumns="True" />
  1. 要是需要从MainWindow给UserControl传数据,直接在MainWindow里实例化视图模型,再赋值给UserControl的DataContext就行:
// MainWindow.xaml.cs里
var vm = new OrderCatalogViewModel();
// 可以在这里给vm.Orders添加数据或者修改数据
OrderCatalogUC.DataContext = vm;

这样做的好处是UI和数据逻辑完全分离,以后改数据逻辑不用碰UI,改UI也不用动数据代码,维护起来轻松太多。


内容的提问来源于stack exchange,提问作者aimen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:00:53