2009-05-20 25 views
2

這是一個一樣的問題I asked earlier但是,一個參考正常的C#。 這是Silverlight 2中,和我沒有ICustomTypeDescriptorSilverlight 2:動態創建的對象上的INotifyPropertyChanged?

因此,這裏又是一個問題:

我,說幾句開關面板(對於那些喜歡類比)。 這些開關面板中的每一個都具有開關,其名稱(字符串)可以處於開啓或關閉狀態(布爾型)。 開關面板和開關是在它們上面有INotify接口的對象。

使用開關名稱,我創建了集合上所有可能的開關名稱的列表,並創建一個包含所有這些名稱作爲屬性的動態類。

SwitchPanel1 (Switches(Switch1 ("Main",On) , Switch2("Slave",Off))) 
SwitchPanel2 (Switches(Switch1 ("Bilge",On) , Switch2("Main",Off))) 

可生產的

(Main,Bilge,Slave) 

的集合和一個動態類產生具有屬性:

SwitchPanel : (SwitchPanel) 
Main : (Switch) 
Bilge : (Switch) 
Slave: (Switch) 

的想法是,如果開關面板具有與所述名稱的開關的財產,它被放置在該財產。因此,使用LINQ位

propeties["Main"].SetValue(newSwitchType,SwitchPanel.Switches.FirstOrDefault(sw => sw.Name == "Main")); 

我想施放此新的動態類INotfyPropertyChanged和捕捉這些新特性的實際變化的,因此,如果開關的狀態改變的動態對象會報告。

爲什麼?它需要在列表視圖中顯示,我使用的列表視圖通過提供屬性名稱而不是綁定路徑來綁定它。

它還試圖通過將對象強制轉換爲INotifyPropertyChanged來捕獲INotify事件。這意味着它會在事情發生變化時進行排序和/或分組。

回答

0

你可以創建一個派生的泛型字典字典,bool實現INotifyPropertyChanged。索引器可以是這樣的:

public new bool this[string key] 
{ 
    get 
    { 
     if(this.ContainsKey(key)) 
      return base[key]; 
     return default(bool); 
    } 
    set 
    { 
     base[key] = value; 
     OnPropertyChanged(key.ToString()); 
    } 
} 

的在開關面板使用自定義的IValueConverter到交換機綁定到詞典:

http://silverlight.net/forums/t/51864.aspx

這樣,你仍然可以擁有的動態集合名稱,每個都有一個關聯的布爾值,並直接綁定到數據而不創建動態類型。

+0

有趣。將盡快放棄它。 – Dann 2009-05-25 02:39:30