DataTable 绑定到 DataGrid WPF

DataTable binding to DataGrid WPF

XAML 文件:

<DataGrid ItemsSource="{Binding Items}" x:Name="ItemsDataGrid" Margin="0,30,0,0" AutoGenerateColumns="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Sl. No." MinWidth="125" />
        <DataGridTextColumn Header="Name" MinWidth="200" />
        <DataGridTextColumn Header="Total Quantity" MinWidth="200" />
        <DataGridTextColumn Header="Remaining" MinWidth="200" />
        <DataGridTextColumn Header="Cost/Each" MinWidth="200" />
    </DataGrid.Columns>
</DataGrid>

XAML.CS 文件:

private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
    _itemsViewModel = new ItemsViewModel();
    this.DataContext = _itemsViewModel;
}

ViewModel.cs 文件:

private DataTable _itemsList;
private List<ItemsModel> ItemsModel;

public DataTable ItemsList
{
    get { return _itemsList; }
    set
    {
        _itemsList = value;
        OnPropertyChanged("ItemsList");
    }
}

private List<ItemsModel> _items;

public List<ItemsModel> Items
{
    get { return _items; }
    set
    {
        _items = value;
        OnPropertyChanged("Items");
    }
}

public ItemsViewModel()
{
    LoadItems();
}

private void LoadItems()
{
    CFunctions cFunctions = new CFunctions();
    ItemsList = cFunctions.GetItems();
    ItemsModel = new List<ItemsModel>();
    for (int i = 0; i < ItemsList.Rows.Count; i++)
    {
        ItemsModel.Add(new ItemsModel()
        {
            SlNo = int.Parse(ItemsList.Rows[i].ItemArray[0].ToString()),
            ItemName = ItemsList.Rows[i].ItemArray[1].ToString(),
            Quantity = int.Parse(ItemsList.Rows[i].ItemArray[2].ToString()),
            Remaining = int.Parse(ItemsList.Rows[i].ItemArray[3].ToString()),
            Cost = int.Parse(ItemsList.Rows[i].ItemArray[4].ToString())
        });

    }
    Items = ItemsModel;
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

Model.cs 文件:

class ItemsModel
{
    public int SlNo        { get; set; }
    public int Quantity    { get; set; }
    public int Cost        { get; set; }
    public int Remaining   { get; set; }
    public String ItemName { get; set; }
}

如果 AutoGenerateColumns="True" 它会创建列并将数据添加到这些创建的列中,例如:

当它为 false 时,DataGrid 为空。

我这样做是正确的吗?为什么它不绑定到已创建的列?

您缺少:

Binding="{Binding Description}"

每个列定义的属性。您必须明确 link 它们到您的模型 class 属性。

就像 Digitlafront 说的,你需要设置绑定

<DataGrid ItemsSource="{Binding Items}" x:Name="ItemsDataGrid" Margin="0,30,0,0"
         AutoGenerateColumns="False">
   <DataGrid.Columns>
     <DataGridTextColumn Binding="{Binding SlNo, Mode=OneWay}" Header="Sl. No." MinWidth="125" />
     <DataGridTextColumn Binding="{Binding ItemName}" Header="Name" MinWidth="200" />
     <DataGridTextColumn Binding="{Binding Quantity} Header="Total Quantity" MinWidth="200" />
     <DataGridTextColumn Binding="{Binding Remaining} Header="Remaining" MinWidth="200" />
     <DataGridTextColumn Binding="{Binding Cost} Header="Cost/Each" MinWidth="200" />
   </DataGrid.Columns>
  </DataGrid>

您还应该根据需要设置 Mode=TwoWay 或 OneWay。 我会使用 ObservableCollection 而不是 List。