我有一個自定義的C#類型一樣(只是一個例子):如何將一個自定義類型綁定到TextBox.Text?
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序列,恢復舊值)。最終結果是文本框中新輸入的條目在應用後立即恢復。
我覺得好像只有一些簡單的失蹤。在那兒?這整個項目/方法註定要失敗嗎?有沒有人試圖這樣瘋狂?如何雙向綁定自定義的多部分類型到基於字符串的控件?
解決方案:奇怪的是,所有需要的是在綁定對象上啓用「格式化」。 (感謝,喬恩斯基特):
textBox.DataBindings.Add("Text", this, "MyVectorProperty"); //FAILS
textBox.DataBindings.Add("Text", this, "MyVectorProperty", true); //WORKS!
奇怪的是,所有我MSDN提到有關此參數(formattingEnabled)是:
「真格式化顯示的數據;否則爲false」
它沒有提及它是數據從控件返回(在這些條件下)的要求。
感謝您的反饋,我澄清了這個例子,並提出了更通用的問題。我的例子是一個簡單的結構,但我已經將它改爲參考類型來演示更廣泛的問題。 – el2iot2 2009-01-22 18:05:57