2016-04-05 58 views
2

コンテキストのVisual Studio 2015WPFにバインドされたDataGrid - 非表示の列を追加してステータスを表示できますか?

問題

を使用して

C#WPFデスクトップアプリケーション私がしようとしているデータの利用者の行を示すリスト< T>オブジェクトにバインドされたデータグリッドを持っています処理される。それらが処理されるにつれて、このDataGridに「Status」列を追加して、各行の処理の成功またはその他を示す必要があります。私はこの余分な列をmanupulating行くにはどうすればよい

質問

?私は2つのアプローチを考えました:

  1. ステータスデータを含むようにバインドされたデータを変更してください。しかし、バウンドオブジェクトは外部ソースAPIから直接取得され、したがって構造は固定されているので、これは難しいことです。
  2. バインドされていない列を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> 

グリッドがユーザに表示され、[状態]列は、最初はブランクであるべきです。ユーザーが進行ボタンを押すと、データの各行がデータベースにコミットされるたびに、ステータス列に成功または失敗のメッセージを挿入したいと考えています。

..theグリッドが現在と背後にあるコードに移入され...

orders = new List<WebServiceOrders.Order>(); 

orders = WebAPI.ListOrders(ordersClient.Client, LastImportedDateTime).OrderBy(o => o.LastUpdateDate).ToList(); 

WebServiceOrders.Order は、Statusプロパティ

答えて

1

を持っていないラップする完全に正常的な方法でありますDataGridのようなリストコントロールにバインドする前に、ViewModelで各行のデータを処理します。これにより、追加のプロパティを追加する簡単な方法と、行レベルでコンテキスト固有のコマンドを実装する簡単な方法(すべて元のデータ項目を変更することなく)が可能になります。

グリッドにバインドされたList<MyRowViewModel>があります。あなたを - もちろん

var orders = WebAPI.ListOrders(); 
var myWrappedList = (from order 
        in orders 
        select new MyRowViewModel(order)) 
        .ToList(); 
MyDataGrid.ItemsSource = myWrappedList; 

ちょうど擬似コードです:あなたは、データオブジェクトの元のリストを取得したら、

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 
} 

包まれたオブジェクトを含む新しいリストを作成:MyRowViewModelは、このようになります。 MyRowViewModelアイテムをObservableCollectionに割り当てる方がよいでしょう。次に、グリッド列を明示的に定義し、適切なプロパティにバインドすることができます。

+0

これは扱いになり、私が見ている他のプロジェクトにとって本当に便利な概念です - ありがとう。 – ifinlay

関連する問題