WPF绑定DataGrid - 我可以添加未绑定列来显示状态吗?

时间:2016-04-05 10:29:09

标签: c# wpf binding datagrid

上下文

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

问题

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

问题

我该如何处理这个额外的列?我考虑了两种方法:

  1. 更改绑定数据以包含Status元素。然而,这很棘手,因为绑定对象直接从外部源API获得,因此结构是固定的。
  2. 将未绑定的列添加到DataGrid(请参阅下面的示例)。这是我的首选方法,但我不知道如何在处理每一行时访问未绑定的单元格以更新状态。
  3. 示例

    <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 没有状态属性

1 个答案:

答案 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然后绑定到它。然后,您可以显式定义网格列并将它们绑定到相应的属性。