2010-11-14 21 views
0

TLDR版本: 我需要找到一種方式來實現某種「MessageCenter」,其中任何控制可以註冊以接收來自其他控件的消息,而不用知道在那裏這些消息是從哪裏來的(或者它可以知道,只要它不意味着任何額外的工作)。打完整件事後,我想我已經幫助自己實現了我所追求的目標,但如果您能推薦一些預先打包的解決方案,那就太棒了!WPF - 脫節的控制需要溝通


所以,我正在研究這個項目,在這個項目中用戶可以做出一些選擇和(或多或少)佈局一個頁面。雖然規則非常嚴格。在每一步中,他們都可以通過有限數量的方式來改變頁面。將其視爲模板系統。

有多種接口: ITemplate,IContentArea和ISpecificControl 每個模板都有一定數量的內容區域。每個ContentArea都有三個特定的控件。

他們得到複合在一起像這樣拉原油: My Terrible Example

大淺紫色十歲上下框模板。 黃色,粉色和棕色框是IContentArea的不同具體類型。 綠色,淺藍色和深紫色的盒子是不同的具體類型的ISpecificControl。

這些接口的每個具體實現都會有一些我希望用戶能夠設置的公共屬性。

例如: 綠盒可以讓你設置字體大小和字體顏色。 淺藍色框可能會讓您設置背景顏色。 深紫色的盒子可能會讓您設置圖像大小和邊距。 黃色,粉紅色和棕色的框讓你選擇你想要使用哪三種特定的控件。 大的淺紫色框讓你選擇內容區域的佈局(有些可能只有兩個或三個,也許它們排列在對角線上)。

我做了一個自定義屬性,我可以申請特性,因爲它們標記爲符合用戶改變視圖模型,我已經預留一定的空間,動態添加設置的控制。這個想法是,用戶一次只能編輯一個項目。當他們選擇它時,我將使用反射來檢查控件的ViewModel的公共屬性,並查找所有標記爲editable屬性的屬性,查看它們的類型,並動態生成控件以編輯它們(當然,綁定)。我們將這稱爲「SettingsWizard」。

所以這個問題實際上是兩個方面:

1:你會如何建議我限制用戶一次只能選擇一個盒子?很明顯,我需要某種應用程序範圍的事件或消息。什麼形式將採取完全?我將如何註冊我的「SettingsWizard」來獲取這些消息。我覺得這將是一件非常簡單的事情,但我忽略它,因爲它感覺不對,或者不乾淨。

任何讓這些控件之一發出一條消息,說:「嘿,我是最後一個點擊了,如果其他人被選中,現在你沒有,」將解決問題,只要接收控件不必知道消息來自何處。

我在想某種靜態的「MessageCenter」,當創建每個控件時,它使用定義的接口註冊消息(在它的構造函數中),任何控件都可以向MessageCenter發送消息,然後它會通過它。那個聽起來是對的嗎?我覺得這種性質已經存在。像Prism中的特徵一樣(但我並不需要其他任何特性)。

2nd:我該如何讓我的「SettingsWizard」知道他有一個他需要顯示設置的新項目?據推測,第一個項目的解決方案也可以用來解決這個問題。這只是一種不同的通知。

回答