2011-10-13 52 views
1

在Silverlight中的Web應用程序,我有一個服務,它在我宣佈一個枚舉爲期一週的天接口:綁定枚舉複選框和位運算

[Serializable] 
[DataContract] 
[Flags] 
public enum WeekDaysFlags : int { 
[EnumMember] 
Monday = 1, 
[EnumMember] 
Tuesday = 2, 
[EnumMember] 
Wednesday = 4, 
[EnumMember] 
Thursday = 8, 
etc. 

早在應用程序中,我有每天想要綁定的複選框;我沒有做出接受一個參數一個漂亮的轉換器:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      int d; 
      if (int.TryParse(parameter.ToString(), out d)) 
      { 
       WeekDaysFlags mask = WeekDaysFlags.Monday; 
       switch (d) 
       { 
        case 0: 
         mask = WeekDaysFlags.Sunday; 
         break; 
        case 1: 
         mask = WeekDaysFlags.Monday; 
         break; 
        case 2: 
         mask = WeekDaysFlags.Tuesday; 
         break; 
        case 3: 
         mask = WeekDaysFlags.Wednesday; 
         break; 
        case 4: 
         mask = WeekDaysFlags.Thursday; 
         break; 
        case 5: 
         mask = WeekDaysFlags.Friday; 
         break; 
        case 6: 
         mask = WeekDaysFlags.Saturday; 
         break; 
       } 

       WeekDaysFlags day = (WeekDaysFlags)value; 
       return (day & mask) == day; 
      } 

      return false; 
     } 

然後複選框的財產器isChecked收到類似下面,用參數從0到6的每一天。

IsChecked="{Binding WeeksDays, Mode=TwoWay, Converter={StaticResource DayOfWeekConverter}, ConverterParameter=1}"

然後我跑我的程序,讀取數據庫,綁定的對象aaaaand ...什麼!由於WeekDays變量包含5,因此我希望檢查星期一和星期三。 當我調試時,我確實用正確的值和正確的參數進入了轉換器,它在應該這樣做時返回true或false,但是在用戶界面,沒有選中複選框。沒有comprendo ...

目前,因爲我需要它的工作,我從後面的代碼手動分配...器isChecked

如果你有一個解決方案,那將是偉大的!我還想知道當我需要「閱讀」選中的複選框時,綁定是如何工作的;即如何獲得'星期一|星期三|週四,或13,或任何從複選框/我刮頭

謝謝您的幫助,我的綁定變量;)

西爾

回答

1

整個位掩模轉換器設置讓我感到過度工程。這將是很難得到正確的,它不是很靈活。

考慮將您的枚舉解壓到ViewModel上的布爾值數組中。使它成爲(bool,字符串)的列表,並且您可以使用CheckBox模板將它綁定到ItemsControl。沒有更多的重複代碼和標記。

+0

謝謝!這對我來說很好! – Slyvain

2

那麼對於初學者這一點: -

return (day & mask) == day; 

應該

return (day & mask) == mask; 

我會進一步說,你應該看看使用Enum.Parse。這將允許您在ConvertParameter作業中使用「星期日」,「星期一」等日常用詞。這將使Xaml更具可讀性並消除醜陋的switch構造。

你知道這隻適用於一種方式嗎?如果用戶選擇/取消選擇組合框,則不能使用此轉換器方法更新位域。這是由於需要能夠讀取位域的當前狀態來更新它,但IValueConverter中的反向轉換無法發現值的當前狀態。

+0

謝謝安東尼,我的病情確實有缺陷。我擔心它只能以一種方式工作...... Henk給出的解決方案非常適合我。 – Slyvain