繁体   English   中英

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}"

每个列定义上的属性。 您必须将它们显式链接到模型类属性。

如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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM