上下文
使用 Visual Studio 2015 的 C# WPF 桌面应用程序
问题
我有一个绑定(bind)到 List< T > 对象的 DataGrid,显示即将处理的用户数据行。在处理它们时,我希望在此 DataGrid 上有一个额外的“状态”列,以指示每一行的处理是否成功。
问题
我该如何操作这个额外的列?我考虑过两种方法:
- 更改绑定(bind)数据以包含 Status 元素。然而,这很棘手,因为绑定(bind)对象是直接从外部来源的 API 获得的,因此结构是固定的。
- 向 DataGrid 添加一个未绑定(bind)的列(参见下面的示例)。这是我的首选方法,但我不知道如何访问未绑定(bind)的单元格以在处理每一行时更新状态。
示例
<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 没有 Status 属性
最佳答案
在将每一行数据绑定(bind)到列表控件(如 DataGrid)之前,用 ViewModel 包装每一行数据是一种完全正常的做法。这使您可以轻松地添加额外的属性,并可以轻松地在行级别实现上下文特定命令 - 所有这些都无需更改原始数据项。
所以你会得到一个List<MyRowViewModel>
绑定(bind)到网格。 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,然后将其绑定(bind)到。然后您可以显式定义您的网格列并将它们绑定(bind)到适当的属性。
关于c# - WPF 绑定(bind) DataGrid - 我可以添加一个未绑定(bind)的列来显示状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36423810/