命名と列挙型の違いにより、単純にバインドすることはできません。次のことを考えました:
- 変換された値の配列をデータソースとして使用します。
- 列挙値と表示値の間で変換するためのformat/parseイベントを使用したプロパティのデータバインディング。
例:
BindingSource bs = new BindingSource();
bs.DataSource = this.testdata;
this.textBox1.DataBindings.Add("Text", this.bs, "CurrentState", true, DataSourceUpdateMode.OnPropertyChanged);
this.textBox1.ReadOnly = true;
this.comboBox1.DataSource = new List<string>() { "Goed", "Slecht", "Lelijk", "-" };
Binding b = new Binding("SelectedValue", this.bs, "CurrentState", true, DataSourceUpdateMode.OnPropertyChanged);
b.Parse += new ConvertEventHandler(TextToState);
b.Format += new ConvertEventHandler(StateToText);
this.comboBox1.DataBindings.Add(b);
[...]
void StateToText(object sender, ConvertEventArgs e)
{
State state = (State)Enum.Parse(typeof(State), e.Value as string);
switch (state)
{
case State.Good:
e.Value = "Goed";
break;
case State.Bad:
e.Value = "Slecht";
break;
case State.Ugly:
e.Value = "Lelijk";
break;
default:
e.Value = "-";
break;
}
}
void TextToState(object sender, ConvertEventArgs e)
{
switch (e.Value as string)
{
case "Goed":
e.Value = State.Good;
break;
case "Slecht":
e.Value = State.Bad;
break;
case "Lelijk":
e.Value = State.Ugly;
break;
default:
e.Value = State.None;
break;
}
}
これは、機能をテストするための単なる例です。テキストボックスは、コンボボックスに表示される値が実際にデータバインドされたプロパティの値であることを確認するために使用されます。
このコードは機能します。ただし、回避できない問題が2つあります。
- コンボボックスは、選択された項目が1回変更されるまで、データソースの最初の値(プロパティの状態ではない)を選択します。その後、バインディングは正常に機能します。
- フォームを閉じることができません。
ロード時にバインディングが更新に失敗する理由がわかりません。バインディングなどをリセットしてみましたが、何も動作しません。また、フォームが閉じられない理由についてもわかりません。