将组合框绑定到字典,下拉列表显示键和值



我一直在绞尽脑汁,但似乎没有解决办法,所以…我有一个组合框,它在视图模型中显示绑定到字典的语言列表,并带有语言列表和语言键枚举。字典以所显示的任何语言显示语言字符串,键用于设置该语言,一切正常,除了..虽然所选项显示的是正确的语言字符串,但下拉列表显示的是键值对,如:(英语、英语)(法语,法语)等。下面是我如何设置组合:

<ComboBox Name="LanguageCombo"
        DisplayMemberPath="Value"
        IsReadOnly="True"
        ItemsSource="{Binding LanguageDictionary}"
        SelectedValue="{Binding Language, Mode=TwoWay}"
        SelectedValuePath="Key">
</ComboBox>

在viewmodel中:

private Dictionary<Languages, string> _languageDictionary = LanguageManager.LanguageDictionary;
public Dictionary<Languages, string> LanguageDictionary
{
    get { return _languageDictionary; }
    set
    {
        if (_languageDictionary != value)
        {
            _languageDictionary = value;
            RaisePropertyChanged("LanguageDictionary");
        }
    }
}
public string Language
{
    get { return LanguageManager.Language.ToString(); }
    set
    {
        if (value != null)
        {
            if (LanguageManager.Language != value)
            {
                // do some stuff
                RaisePropertyChanged("Language");
            }
        }
    }
}

好的,这里有一些代码,到目前为止它是一个属性在一个名为LanguageManager的类中,它做提升,还有一个静态类,字典名为LanguageNames ..

LanguageManager:

public static Dictionary<Languages, string> LanguageDictionary
        {
            get { return LanguageNames.CulturedNames[LanguageNames.Culture]; }
        }

LanguageNames:

public static class LanguageNames
{
    public static CultureInfo Culture { get; set; }
    public static readonly Dictionary<CultureInfo, Dictionary<Languages, string>> CulturedNames;
    static LanguageNames()
    {
       CulturedNames = new Dictionary<CultureInfo, Dictionary<Languages, string>>
        {
            {  // english 
                new CultureInfo("en"), new Dictionary<Languages, string>
                {
                    {Languages.English, "English"},
                    {Languages.French, "French"},
                    {Languages.German, "German"},
                    {Languages.Italian, "Italian"},
                    {Languages.Japanese, "Japanese"},
                    {Languages.Portuguese, "Portuguese"},
                    {Languages.Spanish, "Spanish"},
                }
            },
            {   // french
                new CultureInfo("fr"), new Dictionary<Languages, string>
                {
                    {Languages.English, "Anglais"},
                    {Languages.French, "Français"},
                    {Languages.German, "Allemand"},
                    {Languages.Italian, "Italien"},
                    {Languages.Japanese, "Japonais"},
                    {Languages.Portuguese, "Portugais"},
                    {Languages.Spanish, "Espagnol"},
                }
            },

等。

语言枚举:

public enum Languages
{
    English,
    French,
    German,
    Italian,
    Japanese,
    Portuguese,
    Spanish,
}

就像我说的,这一切都工作完美,除了,下拉列表显示键/值对,而不仅仅是语言字符串。我做错了什么?非常感谢大家的帮助和建议。

ItemsSource与IEnumerable一起显示项目。字典派生自

IEnumerable<KeyValuePair>

尝试绑定到LanguageDictionary。值。

另外,注意这两个都不是可观察集合,所以你不会在ComboBox中获得更新。这可能是好的,取决于你的情况,但如果你想要更新,那么看看暴露一个ObservableCollection为你的语言列表。

:我刚刚尝试使用DisplayMemberPath &SelectedValuePath,它对我来说工作得很好…

<Window x:Class="ComboBoxTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:comboBoxTest="clr-namespace:ComboBoxTest"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <comboBoxTest:MyDictionary x:Key="MyDictionary">
        <system:String x:Key="3">Three</system:String>
        <system:String x:Key="4">Four</system:String>
        <system:String x:Key="5">Five</system:String>
    </comboBoxTest:MyDictionary>
</Window.Resources>
<StackPanel>
    <ComboBox x:Name="ComboBox"
              DisplayMemberPath="Value"
              SelectedValuePath="Key"
              ItemsSource="{StaticResource MyDictionary}">
    </ComboBox>
    <TextBlock Text="{Binding ElementName=ComboBox, Path=SelectedValue}"></TextBlock>
</StackPanel>
</Window>
我有一种奇怪的感觉,你的类型引起了一个问题。键的类型是"Languages",你在你的SelectedValuePath中绑定到类型为"string"的值。

我最终完全走到了另一个方向。我将适当的语言名称放在资源字典中,资源字典还定义了所有应用程序字符串(lang.it)。Xaml等),然后将它们作为动态资源添加到组合框中

            <ComboBox Name="LanguageCombo"
                      IsReadOnly="True"
                      SelectedIndex="{Binding LanguageIndex, Mode=TwoWay}">
                <ComboBoxItem Content="{DynamicResource LanguageEnglish}"/>
                <ComboBoxItem Content="{DynamicResource LanguageFrench}"/>
                <ComboBoxItem Content="{DynamicResource LanguageGerman}"/>
                <ComboBoxItem Content="{DynamicResource LanguageItalian}"/>
                <ComboBoxItem Content="{DynamicResource LanguageJapanese}"/>
                <ComboBoxItem Content="{DynamicResource LanguagePortuguese}"/>
                <ComboBoxItem Content="{DynamicResource LanguageSpanish}"/>
            </ComboBox>

然后使用索引从视图模型属性设置语言:

VM:

    public int LanguageIndex
    {
        get { return _languageIndex; }
        set
        {
            if (value > -1 && _languageIndex != value)
            {
                _languageIndex = value;
                Languages lang = LanguageManager.GetLanguageKey(value);
                LanguageManager.SetLanguage(lang);
                RaisePropertyChanged("LanguageIndex");
            }
        }
    }

最新更新