クラスと、このクラスを使用してリスト内のリストを提供する一連の IEnumerables があります。(詳細については、この質問の回答を参照してください。)
コードは次のとおりです。
public IEnumerable<IEnumerable<WorkItemColumn>> EnumerateResultSet(WorkItemCollection queryResults)//DisplayFieldList displayFieldList)
{
foreach (WorkItem workItem in queryResults)
{
yield return EnumerateColumns(queryResults.DisplayFields, workItem);
}
}
public IEnumerable<WorkItemColumn> EnumerateColumns(DisplayFieldList resultSet, WorkItem workItem)
{
foreach (FieldDefinition column in resultSet)
yield return new WorkItemColumn { Name = column.Name, Value = workItem[column.Name], WorkItemForColumn = workItem};
}
そしてクラス:
public class WorkItemColumn
{
public string Name { get; set; }
public object Value { get; set; }
public WorkItem WorkItemForColumn { get; set; }
}
この結果を ListBox の ItemsSource に設定しました
Form.QueryResultListSource = EnumerateResultSet(queryResults);
このリスト ボックスのイベントをキャッチしようとすると、問題が発生します。
public void QueryResultsSelectionChanged(SelectionChangedEventArgs e)
{
+-----------------+
v |
foreach (WorkItemColumn workItemColumn in e.AddedItems) |
{ |
AddWorkItemToPad(workItemColumn.WorkItemForColumn); |
} +---------------|
| |
v |
foreach (WorkItemColumn workItemColumn in e.RemovedItems) |
{ |
RemoveWorkItemFromPad(workItemColumn.WorkItemForColumn); |
} |
|
} |
|
These items are where the problem is --------------------------------+
デバッグ中に e.AddedItems[0] を調べると、そのタイプは EnumerateColumns であると表示されます。
その型にキャストしようとすると、Visual Studio は (当然のことながら) EnumerateColumns はメソッドですが、型のように使用されると言っています。
では、これをタイプ別に参照して、foreach ループを実行し、その中のものを取得するにはどうすればよいでしょうか?
これは、答えに基づいて更新されたコードです。
public void QueryResultsSelectionChanged(SelectionChangedEventArgs e)
{
foreach (IEnumerable<WorkItemColumn> workItemColumns in e.AddedItems)
{
if (workItemColumns.Count() > 0)
AddWorkItemToPad(workItemColumns.First().WorkItemForColumn);
}
foreach (IEnumerable<WorkItemColumn> workItemColumns in e.RemovedItems)
{
if (workItemColumns.Count() > 0)
RemoveWorkItemFromPad(workItemColumns.First().WorkItemForColumn);
}
}