2012-10-02 24 views
0

我必須將Flags Enumeration映射到多個組合框。如何將Flags枚舉映射到多個組合框?

例如,第一個2位需要以對應於組合框爲屏幕的對比度設置:

Bit 0 - 1: Contrast (0=Low/1 = Medium/2=high) 

位2 & 3需要爲對應於語音音量

Bit 2 - 3: Speech volume (0=Low/1 = Medium/2 = High) 

和位4 & 5對應於蜂鳴器音量。

Bit 4 – 5: Buzzer volume (0=Low/1 = Medium/2 = High) 

位6對應於進入或退出(即,如果它是在它的進入,如果是關閉它的退出)

Bit 6: Entry/exit indication 

我旗枚舉被定義爲:

[Flags] 
public enum RKP 
{ 
    Contrast0 = 1,    // bit 0 
    Contrast1 = 2,    // bit 1 
    SpeechVolume2 = 4,   // bit 2 
    SpeechVolume3 = 8,   // bit 3 
    BuzzerVolume4 = 16,   // bit 4 
    BuzzerVolume5 = 32,   // bit 5 
    EntryExitIndication = 64, // bit 6 
} 

什麼將這些映射到適當的組合框的最佳方法,然後將每個組合框的值轉換爲正確的枚舉值以保存它?

+1

如果您堅持縮小信息大小,您應該製作一個固定大小的結構並提供提取和設置信息的函數。其餘的應該是硬編碼的。 – SimpleVar

+0

也許這可能會給你一個想法:http://www.thejoyofcode.com/Xaml_ObjectDataProvider._They_really_did_think_of_everything.aspx –

回答

0
[Flags] 
public enum RKP 
{ 
    LowContrast = 0, 
    MediumContrast = 1,   // bit 0 
    HighContrast = 2,   // bit 1 

    LowSpeechVolume = 0, 
    MediumSpeechVolume = 4,  // bit 2 
    HighSpeechVolume = 8,  // bit 3 

    LowBuzzerVolume = 0, 
    MediumBuzzerVolume = 16, // bit 4 
    HighBuzzerVolume = 32,  // bit 5 

    ExitIndication = 0, 
    EntryIndication = 64,  // bit 6 
} 

contrastComboBox.ItemsSource = new[] { RKP.LowContrast, RKP.MediumContrast, RKP.HighContrast }; 
contrastComboBox.SelectedItem = currentValue & (RKP.MediumContrast | RKP.HighContrast); 
//and so on for each combo box... 

//and when you want the result: 
RKP combinedFlag = (RKP)contrastComboBox.SelectedItem | //other combo box items 

你可能會想要做些什麼字符串顯示,但這是基本的想法。

+2

這並不能解釋你如何選擇正確的值在每個組合框中顯示*。此外,因爲可能有一個枚舉值'12'(包括'MediumSpeechVolume' *和*'HighSpeechVolume'),所以用這種方法很容易解除。很好的嘗試,但我認爲OP需要重新考慮這種方法。 –

+1

@DanPuzey'currentValue&(RKP.MediumContrast | RKP.HighContrast)'和我使用'|'將單個值加入組合標誌有什麼不對嗎?在我看來,它應該導致正確的值。當然,值爲'12'會導致問題,不應該被認爲是有效的,正如'-1'不應該被認爲是有效的。我同意@WillemDuncan的第二段:具有單獨屬性的類將是可取的。不過,我認爲它可以按提問者的意願工作。 –

+0

它可能並不清楚,但我絕對打算批評問題的方法而不是你的方法。你是對的,'-1'不應該是有效的 - 但是,'-1'在枚舉中不會是有效的值。 ''*會*,因此我認爲OP需要重新思考。你的方法可能是最好的,它可以給予wonky數據模型! –

2

使用您的解決方案,可以創建衝突的值,例如,如Dan Puzey指出的,合併MediumSpeechVolumeHighSpeechVolume

您的解決方案是否被標記爲enum?這可以使用一個簡單的類來解決,其中需要4個枚舉作爲屬性。如果您需要由當前標誌枚舉生成的確切位模式,請創建另一個屬性進行公開,使用自定義getset將4個主要屬性的當前值轉換爲所需的位模式並返回。

+1

我不同意你的第一個陳述。如果這個值是4,那麼在我看來,顯然對比度和蜂鳴器是低的,語音媒體和出口是指示的。即可以指定較低的值,而不是每個值都爲0.我喜歡將第二段作爲首選解決方案,並且已經爲此提供了贊成。 –

+1

我也不同意第一種說法,但它*很複雜:你只能從沒有「中」和「高」的情況下檢測到「低」值。定義一個單獨的結構來將這些位解析爲三個值肯定會更有意義。 –

+0

你說得對,我已經編輯了答案,刪除了不正確的聲明,謝謝指出。 –