2009-01-21 29 views
1

其實我正在使用C#並已經有了DataBinding和Serialization的工作。但是現在我想將兩種方法結合在一個課堂中,而且我遇到了一些問題。組合序列化和數據綁定的問題

因此,讓我們先從一個小樣本類:

using System; 
using System.Runtime.Serialization; 
using System.Windows.Forms; 

namespace MySample 
{ 
    [DataContract(IsReference = true)] 
    class SerializeAndBind : IExtensibleDataObject 
    { 
     [DataMember] 
     private String bindedControlName; 
     [DataMember] 
     private String bindedPropertyName; 

     private DateTime creationTime; 

     [System.ComponentModel.Browsable(false)] 
     public virtual ExtensionDataObject ExtensionData { get; set; } 

     public event EventHandler CreationTimeChanged; 

     public SerializeAndBind() 
     { 
      CreationTime = DateTime.Now; 
     } 

     public SerializeAndBind(Control ControlName, String PropertyName) 
      : this() 
     { 
      InitializeDataBinding(ControlName, PropertyName); 
     } 

     [DataMember] 
     public DateTime CreationTime 
     { 
      get 
      { 
       return creationTime; 
      } 
      set 
      { 
       creationTime = value; 

       if (CreationTimeChanged != null) 
        CreationTimeChanged(this, EventArgs.Empty); 
      } 
     } 

     public override string ToString() 
     { 
      return CreationTime.ToString(); 
     } 

     [OnDeserialized] 
     private void InitializeDataBindingAfterDeserialization(StreamingContext ctx) 
     { 
      if (bindedControlName != null) 
      { 
       Control control; 

       control = FindControlByName(bindedControlName); 

       if(control != null) 
        InitializeDataBinding(control, bindedPropertyName); 
      } 
     } 

     private void InitializeDataBinding(Control ControlName, string PropertyName) 
     { 
      BindingSource bindingSource = new BindingSource(); 
      bindingSource.DataSource = this; 
      Binding binding = new Binding(PropertyName, bindingSource, "CreationTime", true, DataSourceUpdateMode.OnPropertyChanged); 
      binding.Format += new ConvertEventHandler(OnFormat); 
      ControlName.DataBindings.Add(binding); 

      bindedControlName = ControlName.Name; 
      bindedPropertyName = PropertyName; 
     } 

     private void OnFormat(object sender, ConvertEventArgs e) 
     { 
      if (e.DesiredType == typeof(String)) 
      { 
       e.Value = this.ToString(); 
      } 
     } 
    } 
} 

正如你可以看到這個類有一個構造函數這需要控制和屬性名到你喜歡這個對象綁定。對於序列化,我將Control和PropertyName保存爲一個字符串(保存整個控件會稍微多一些;-))。

我添加了一個函數,它將在反序列化之後被調用。但是,正如你所看到的那樣存在那個不存在的功能FindControlByName()

現在我可以開始使用Reflection來找到合適的控件,但是對於反射,我需要某種起始點(我會說表單),但是如何在不知道任何其他內容的情況下訪問它?

或者這只是錯誤的做法,我需要一個不同的設計?

任何幫助將感激, 奧利弗

回答

0

就個人而言,我懷疑,這是以往任何時候都將是「乾淨」 - 序列化可以很好地用於數據,但不能很好地爲緊密連接的外部對象的對象序列化圖。

在反序列化的時候,對象是在以太(事實上,DataContractSerializer甚至不使用任何構造函數)。因此,它無法獲取表單等。您可能會使用靜態字段(也許是[ThreadStatic])做一些可怕的黑客手段來保存當前表單,但它會變得脆弱和醜陋。

(我希望有人將有一個更好的答案,但!)

1

我以前的帖子同意,從您的數據打破了你的處理。更清潔,更易於調試,維護和擴展。