2013-03-28 65 views
0

我想做一個簡單的雙向綁定與枚舉到組合框,但還沒有找到任何與我的代碼到目前爲止的作品。枚舉2路綁定與Combobox

我的枚舉(C#):

public enum CurrenciesEnum { USD, JPY, HKD, EUR, AUD, NZD }; 

枚舉應該設置該屬性/勢必:

private string _ccy; 
    public string Ccy 
    { 
     get 
     { 
      return this._ccy; 
     } 
     set 
     { 
      if (value != this._ccy) 
      { 
       this._ccy= value; 
       NotifyPropertyChanged("Ccy"); 
      } 
     } 
    } 

的XAML代碼不起作用:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ObjectDataProvider x:Key="Currencies" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> 
       <ObjectDataProvider.MethodParameters> 
        <x:Type TypeName="ConfigManager:CurrenciesEnum" /> 
       </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 
    </ResourceDictionary> 
</UserControl.Resources> 

<ComboBox ItemsSource="{Binding Source={StaticResource Currencies}}" SelectedItem="{Binding Ccy, Mode=TwoWay}"/> 

非常感謝您的幫助!

+0

有什麼不對?你得到一個錯誤?組合框中沒有項目? Combobox不顯示正確的項目?當組合框中的選定項目更改時,綁定項目不會更改? – Natrium

+0

組合框本身已被填充。 但是,當我選擇另一個值時,屬性似乎沒有更新 - 包含該屬性的對象實際上是網格中顯示的丟失的一部分,並且更改的行選擇不會保留ccy。 – goul

+0

不好意思,實際上這個屬性是用新值正確設置的。 這個問題似乎是將新設置的值綁定到ComboBox。我應該使用轉換器還是類似的東西? – goul

回答

0

那麼問題在於你將Enum綁定到string,由於綁定引擎中的默認ToString操作,這隻會以單向方式工作。

如果你只使用string值更改ObjectDataProvider方法名GetNames這將返回字符串值,請Enum,並會結合兩種方式,其他的選項是不綁定到一個字符串,但Enum類型。

<ObjectDataProvider x:Key="Currencies" MethodName="GetNames" ObjectType="{x:Type System:Enum}"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="ConfigManager:CurrenciesEnum" /> 
      </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
+0

謝謝。 我已經嘗試了你建議的兩種方式,但仍然無效。使用Snoop,我看到Ccy屬性在ComboBoox中更改時正確設置。然而,看着ComboBox,我看到... 1)我選擇EUR:[SelectedItem> EUR {Path = Ccy},SelectedValue> EUR]。 2)我改變焦點並回來(我的ComboBox仍然應該顯示歐元,但它默認回到美元):[SelectedItem> UAD {Path = Ccy},SelectedValue> USD] – goul

+0

看來,共振是加載第一次沒有使用Ccy porperty的值,而是默認枚舉的第一個值。我在映射中錯過了什麼?它應該是單向的嗎?或者我怎樣才能停止ComboBox默認? – goul

0

我枚舉加載到字典

public static Dictionary<T, string> EnumToDictionary<T>() 
     where T : struct 
{ 
    Type enumType = typeof(T); 

    // Can't use generic type constraints on value types, 
    // so have to do check like this 
    if (enumType.BaseType != typeof(Enum)) 
     throw new ArgumentException("T must be of type System.Enum"); 

    Dictionary<T, string> enumDL = new Dictionary<T, string>(); 
    //foreach (byte i in Enum.GetValues(enumType)) 
    //{ 
    // enumDL.Add((T)Enum.ToObject(enumType, i), Enum.GetName(enumType, i)); 
    //} 
    foreach (T val in Enum.GetValues(enumType)) 
    { 
     enumDL.Add(val, val.ToString()); 
    } 
    return enumDL; 
}