2009-01-22 74 views
7

我有一個自定義的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」

它沒有提及它是數據從控件返回(在這些條件下)的要求。

回答

10

Got it!

Binding.FormattingEnabled屬性設置爲true。這似乎使這一切工作。 您可以通過ControlBindingsCollection.Add方法的超負荷做到這一點,該方法最後採用布爾參數。 這是奇怪的是,它的工作的一種方式,但不是之前其他的,但肯定我的測試應用程序現在工作...

(以下舊答案)

,我也不會感到驚訝,如果事實,你'有一個結構,而不是一個類在這裏很重要 - 以及你使用字段而不是屬性的方式。

嘗試使用autoimplemented屬性的類來代替:

public class MyClass 
{ 
    public int IntPart { get; set; } 
    public string StringPart { get; set; } 
    //... 
} 

這可能不是問題的根源,但使用可變結構具有公共字段是自找麻煩海事組織。

編輯:正如在評論中提到的,我現在已經有一個例子啓動並運行。 Binding.Parse會以正確的值提升。現在找出爲什麼TypeConverter沒有被調用...

編輯:我找到了一個useful article,它描述了更詳細的綁定。似乎表明類型轉換器僅用於將「轉換」爲另一種類型 - 因此您需要使用string的類型轉換器來知道如何轉換爲自定義類型。這似乎很奇怪,我,無可否認,但也有其他兩個選項:

  • 使用格式化和分析結合來進行轉換
  • 讓類型實現IConvertible

既不事件這些吸引力的方式完全相同,但他們可能已足夠爲您解決。我確信有一種方法可以使用TypeConverters來實現這個功能,但如果我現在可以看到它的話,我會受到打擊。

+0

感謝您的反饋,我澄清了這個例子,並提出了更通用的問題。我的例子是一個簡單的結構,但我已經將它改爲參考類型來演示更廣泛的問題。 – el2iot2 2009-01-22 18:05:57

相關問題