私は(ほんの一例)のようなカスタムC#タイプを持っています:
public class MyVector
{
public double X {get; set;}
public double Y {get; set;}
public double Z {get; set;}
//...
}
そして、TextBox.Text にデータバインドしたい:
TextBox textBox;
public MyVector MyVectorProperty { get; set;}
//...
textBox.DataBindings.Add("Text", this, "MyVectorProperty");
基本的に、カスタム値タイプの文字列との間の変換が必要です。テキスト ボックスには、ベクター タイプを更新するために編集できる "x, y, z" のようなものが必要です。TypeConverter
派生クラスを追加することでそれができると仮定しました。
public class MyVectorConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context,
Type sourceType)
{
if (sourceType == typeof(string))
return true;
//...
return base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context,
Type destinationType)
{
if (destinationType == typeof(string))
return true;
//...
return base.CanConvertTo(context, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture,
object value)
{
if (value is string)
{
MyVector MyVector;
//Parse MyVector from value
return MyVector;
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture,
object value,
Type destinationType)
{
if (destinationType == typeof(string))
{
string s;
//serialize value to string s
return s;
}
//...
return base.ConvertTo(context, culture, value, destinationType);
}
}
そしてそれを私の構造体に関連付けます:
[TypeConverter(typeof(MyVectorConverter))]
public class MyVector { //... }
これで戦闘の半分が完了したようです。呼び出されているのがわかりMyVectorConverter
ますが、何かがおかしいです。文字列に変換する方法を知っているかどうかを確認するために呼び出され、次に文字列に変換するために呼び出されます。ただし、FROM 文字列を変換できるかどうか、または実際に変換を実行できるかどうかを確認するために照会されることはありません。さらに、テキスト ボックスでの編集の直後に、古い値がすぐに置き換えられます (別の CanConvertTo および ConvertTo シーケンスで、古い値が復元されます)。最終結果として、テキスト ボックスに新しく入力されたエントリは、適用された直後に元に戻されます。
単純な何かが欠けているように感じます。ある?このプロジェクト/アプローチ全体は失敗する運命にありますか? 他の誰かがそのような狂気を試みますか? カスタムのマルチパート型を文字列ベースのコントロールに双方向にバインドするにはどうすればよいですか?
解決策:奇妙なことに、必要なのは Binding オブジェクトで「書式設定」を有効にすることだけです。(ありがとう、ジョン・スキート):
textBox.DataBindings.Add("Text", this, "MyVectorProperty"); //FAILS
textBox.DataBindings.Add("Text", this, "MyVectorProperty", true); //WORKS!
奇妙なことに、このパラメーター (formattingEnabled) について MSDN で言及されているのは次のとおりです。
"表示されたデータをフォーマットする場合は true、それ以外の場合は false"
(これらの条件下で)データがコントロールから返されるための要件であることについては何も言及されていません。