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