首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DataTable绑定到DataGrid WPF

DataTable绑定到DataGrid WPF
EN

Stack Overflow用户
提问于 2015-03-27 01:54:28
回答 2查看 1.1K关注 0票数 0

XAML文件:

代码语言:javascript
运行
复制
<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文件:

代码语言:javascript
运行
复制
private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
    _itemsViewModel = new ItemsViewModel();
    this.DataContext = _itemsViewModel;
}

ViewModel.cs文件:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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"创建列并将数据添加到以下所创建的列:

当它是假的时候,DataGrid是空的。

我这样做对吗?为什么它不绑定到已经创建的列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-27 01:58:23

你错过了:

代码语言:javascript
运行
复制
Binding="{Binding Description}"

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

票数 3
EN

Stack Overflow用户

发布于 2015-03-27 06:45:40

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

代码语言:javascript
运行
复制
<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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29292034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档