gpt4 book ai didi

c# - WPF 绑定(bind) DataGrid - 我可以添加一个未绑定(bind)的列来显示状态吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:40 24 4
gpt4 key购买 nike

上下文

使用 Visual Studio 2015 的 C# WPF 桌面应用程序

问题

我有一个绑定(bind)到 List< T > 对象的 DataGrid,显示即将处理的用户数据行。在处理它们时,我希望在此 DataGrid 上有一个额外的“状态”列,以指示每一行的处理是否成功。

问题

我该如何操作这个额外的列?我考虑过两种方法:

  1. 更改绑定(bind)数据以包含 Status 元素。然而,这很棘手,因为绑定(bind)对象是直接从外部来源的 API 获得的,因此结构是固定的。
  2. 向 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com