2010-03-23 21 views
1

我有一個任務管理程序,其中包含「緊急」字段。有效值爲Int16,當前映射爲1(高),2(中),3(低),4(無)和99(閉合)。緊急度字段用於對任務進行排序,並改變列表和詳細視圖中項目的外觀。如何處理C#/ WPF/MVVM中的ViewModel和數據庫應用程序

當用戶正在編輯或添加新任務時,他們選擇或查看ComboBox中的緊急程度。轉換器傳遞字符串來替換Ints。緊迫性集合非常簡單,我沒有將它作爲數據庫中的表格,而是一個ObservableCollection(Int16),它由方法填充。

由於同一屏幕可能用於查看已關閉的任務,所以「已關閉」緊急程度必須位於ItemsSource中,但我不希望用戶能夠選擇它。爲了防止用戶能夠在組合框中選擇該項目,但仍然能夠看到它,如果在數據庫中的項具有價值應該我...

  1. 手動ComboBox中禁用的項目在代碼或Xaml中(我懷疑它)
  2. 將Urgency集合從Int16更改爲帶有Selectable屬性的ComboBoxItem的isEnabled屬性綁定到的對象。
  3. 請在2而且在數據庫中的任務表的外鍵分開的緊迫性信息到它自己的表
  4. 以上(我懷疑這是正確答案)

的無我問這是因爲這是一個學習項目(我的第一個真正的WPF和第一個MVVM項目)。我知道很少有一個方式做一些事情,但我想確保,因爲我在一個合理的方式學習,如果更難忘卻壞習慣

感謝

邁克

回答

1

我會支持選項2.聽起來非常適合MVVM。

當有其他應用程序或有報告訪問「緊急性」字段時,選項3會很有利。原因:否則,您需要複製Int16與其含義之間的映射知識。將知識轉移到數據庫以將其保存在一個地方。

也許考慮枚舉使代碼更傳神:

enum Urgency { High=1, Medium=2, Low=3, Closed=99 }; 

這樣,您將有什麼好看的,用於評估IsEnabled屬性是這樣的:

if (urgency == Urgency.Closed) return false; 

當你需要存儲枚舉的數值,您需要事先對Int16進行強制轉換。

+0

感謝您的反饋意見。我應該再次查看枚舉選項。我試圖做到這一點,但我有很多挑戰讓枚舉集合填充組合框。現在我對ComboBox更加舒適,所以我懷疑它會正常工作。我沒有想過報告問題,在我的打印代碼中,我使用了xaml用來獲取字符串的相同轉換器。 – 2010-03-23 04:28:12

+0

只需注意:選項3會使Enum解決方案的吸引力降低,因爲您會再次複製這些知識。 – 2010-03-23 04:41:46

1

我認爲我會先在視圖中修復此問題。有TextBlock顯示「關閉」,和ComboBox顯示的其他值,然後使用數據觸發設置IsVisible上都取決於是否緊迫性爲99

我應該這樣做不是因爲它的最好的技術解決方案(可能不是),而是因爲它可能是最好的UI解決方案。如果用戶無法修改已關閉的項目,則即使在禁用ComboBox中顯示「已關閉」也有點誤導,因爲ComboBox在視覺上表示「這是您可以更改的內容」。它被禁用只是提示用戶想知道他必須做些什麼來啓用它。使用TextBlock是一種明確的說法,「這就是這樣。」

+0

嘿,我喜歡這個想法,我是UI第一編程的粉絲,但不幸的是,我是設計UI(程序員)最糟糕的人。我已經計劃在「添加/編輯」窗口中的所有字段上綁定IsEnabled屬性,但我將把所有ComboBoxes更改爲TextBlocks ......人類Xaml會變得有點長或什麼? – 2010-03-23 06:05:35

+0

它從來沒有簡明扼要,但是,當你學習如何使用模板和樣式以及視圖模型模式時,它會獲得更多的可管理性。 – 2010-03-23 20:11:53

相關問題