using System.Linq.Expressions;
using System.Windows.Forms;
...
public class CheckedListBoxWrapper<T, Tvm, Tdm>
{
CheckedListBox c;
Func<T, Tvm> vmSelector;
Func<T, Tdm> dmSelector;
// コンストラクタ
public CheckedListBoxWrapper(CheckedListBox c)
{
this.c = c;
}
// データソースの設定
public void SetDataSource(
IEnumerable<T> dataSource,
Expression<Func<T, Tvm>> vmSelector,
Expression<Func<T, Tdm>> dmSelector)
{
this.vmSelector = vmSelector.Compile();
this.dmSelector = dmSelector.Compile();
c.DataSource = dataSource.ToList();
c.ValueMember = PocoHelper.GetName(vmSelector);
c.DisplayMember = PocoHelper.GetName(dmSelector);
}
// チェックされた項目の設定と取得
public IEnumerable<T> CheckedItems
{
get
{
var tmp = new List<T>();
foreach (var item in c.CheckedItems)
{
tmp.Add((T)item);
}
return tmp;
}
set
{
for (int i = 0; i < c.Items.Count; i++)
{
var ret = value.Contains((T)c.Items[i]);
c.SetItemChecked(i, ret);
}
}
}
// チェックされた値の設定と取得
public IEnumerable<Tvm> CheckedValues
{
get
{
var tmp = new List<Tvm>();
foreach (T item in c.CheckedItems)
{
tmp.Add(vmSelector(item));
}
return tmp;
}
set
{
for (int i = 0; i < c.Items.Count; i++)
{
var ret = value.Contains(vmSelector((T)c.Items[i]));
c.SetItemChecked(i, ret);
}
}
}
// 全てのチェックをクリア
public void ClearChecked()
{
for (int i = 0; i < c.Items.Count; i++)
{
c.SetItemChecked(i, false);
}
}
// 全てチェック
public void CheckAll()
{
for (int i = 0; i < c.Items.Count; i++)
{
c.SetItemChecked(i, true);
}
}
}
public class PocoHelper
{
internal static string GetName<T, TKey>(Expression<Func<T, TKey>> e)
{
var member = (MemberExpression)e.Body;
return member.Member.Name;
}
}