0

次のインターフェースがあります。

public interface IIdentifiable
{
    object Id { get; }
}
public interface IIdentifiable<T>: IIdentifiable
{
    new T Id { get; }
}
public interface IItem: IIdentifiable<Guid>
{
    string Name { get; set; }
}

リストボックスを次のようなアイテムのリストにバインドしたい場合:

lbItems.DataSource = list;     // List<IItem> here
lbItems.DisplayMember = "Name";
lbItems.ValueMember = "Id";

エラーが表示されます:「新しい値メンバーにバインドできません。パラメーター名: 値」

どうすればこれを解決できますか?

4

1 に答える 1

2

このリンクの人たちに感謝しなければなりません。

WinFormsバインディング システムは の使用に基づいており、宣言されたプロパティのみTypeDescriptorTypeDescriptor.GetProperties(typeof(IItem))返します。ComboBoxNameIItemId

この問題を回避するには、リストの各項目を射影して匿名型を作成する必要がありました。

これが最終的なコードでした:

lbItems.DataSource = list.Select(item => new { item.Id, item.Name }).ToList();
lbItems.DisplayMember = "Name";
lbItems.ValueMember = "Id";
于 2013-06-15T22:52:08.543 に答える