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

标签 c# wpf binding datagrid

上下文

使用 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/

相关文章:

c# - 在 C# 中,是否可以有一个大数组,然后是指向较大数组的子部分的较小数组?

WPF MVVM 选项列表示例

ruby - 异常类如何获得引发它的对象?

c# - 如何在 Visual Studio 中为索引器 "go to definition"设置 `this[]`

c# - 伊朗手机号码的正则表达式?

c# - 创建二进制文件时的文件扩展名是什么

c# - 在 WinForms 中绑定(bind)到 WPF 托管控件的 DependencyProperty

.net - 我可以查看 Visibility = Collapsed 的 WPF ComboBoxItem。这是WPF错误吗?

wpf - 如何绑定(bind)到 ListBox 的视口(viewport)宽度(即没有滚动条的宽度)?

wpf - 如何在 XAML 中放入 unicode 字符?