上下文
使用Visual Studio 2015的C#WPF桌面应用程序
问题
我有一个DataGrid绑定到List< T>显示将要处理的用户数据行的对象。在处理它们时,我希望在此DataGrid上有一个额外的“状态”列,以指示每行处理的成功与否。
问题
我该如何处理这个额外的列?我考虑了两种方法:
示例
<DataGrid DockPanel.Dock="Bottom" Name="ordersGrid" IsReadOnly="True" Margin="0,5,0,0" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Status" Binding="{Binding /}"/>
<DataGridTextColumn Header="Last update date" Binding="{Binding LastUpdateDate, StringFormat=\{0:dd/MMM/yy HH:mm:ss\}}" SortDirection="Ascending"/>
<DataGridTextColumn Header="Order id" Binding="{Binding OrderId}"/>
<DataGridTextColumn Header="Sales channel" Binding="{Binding SalesChannel}"/>
<DataGridTextColumn Header="Currency" Binding="{Binding OrderTotal.CurrencyCode}"/>
<DataGridTextColumn Header="Amount" Binding="{Binding OrderTotal.Amount, StringFormat=N2}"/>
<DataGridTextColumn Header="Number of items" Binding="{Binding NumberOfItemsShipped}"/>
<DataGridTextColumn Header="City" Binding="{Binding ShippingAddress.City}"/>
<DataGridTextColumn Header="County" Binding="{Binding ShippingAddress.StateOrRegion}"/>
<DataGridTextColumn Header="Country" Binding="{Binding ShippingAddress.CountryCode}"/>
</DataGrid.Columns>
</DataGrid>
网格显示给用户,“状态”列最初应为空白。当用户点击“继续”按钮时,我希望使用成功或失败消息填充“状态”列,因为每行数据都已提交到数据库。
..网格当前填充在后面的代码中......
orders = new List<WebServiceOrders.Order>();
orders = WebAPI.ListOrders(ordersClient.Client, LastImportedDateTime).OrderBy(o => o.LastUpdateDate).ToList();
WebServiceOrders.Order 没有状态属性
答案 0 :(得分:1)
在将数据绑定到像DataGrid这样的列表控件之前,使用ViewModel包装每行数据是完全正常的做法。这使您可以轻松地添加额外的属性,以及在行级别实现特定于上下文的命令的简单方法 - 所有这些都无需更改原始数据项。
所以你将拥有绑定到网格的List<MyRowViewModel>
。 MyRowViewModel
可能如下所示:
public class MyRowViewModel
{
public MyRowViewModel(WebServiceOrders.Order order)
{
Order = order;
}
public WebServiceOrders.Order Order { get; set; }
public string Status { get; set; } //note you'll need to implement property notification
}
检索完原始数据对象列表后,创建一个包含包装对象的新列表:
var orders = WebAPI.ListOrders();
var myWrappedList = (from order
in orders
select new MyRowViewModel(order))
.ToList();
MyDataGrid.ItemsSource = myWrappedList;
当然这只是伪代码 - 你最好将MyRowViewModel项分配给ObservableCollection然后绑定到它。然后,您可以显式定义网格列并将它们绑定到相应的属性。