我正在与WPF Combobox作斗争。
我的工作是让用户选择一个条目,该条目应存储在变量中,此外,该变量可能会以编程方式更改,因此组合框应选择相应的项。
首先我的代码:
public KeyValuePair<string, string> SelectedLanguage { get; set; } //the selected item
public Dictionary<string, string> Languages { get; set; } //the list of combobox items
private void loadLanguages(List<string> languages)
{
Languages = new Dictionary<string, string>();
foreach(string language in languages)
{
//set initial selected item
if(language=="de_DE") SelectedLanguage = new KeyValuePair<string, string>(language, getLanguageDescription(language));
Languages.Add(language, getLanguageDescription(language));
}
}
private string getLanguageDescription(string language)
{
switch (language)
{
case "de_DE_Match":
return "Deutsch";
case "fr_FR_Match":
return "Französisch (Frankreich)";
case "nl_NL_Match":
return "Niederländisch";
case "en_EN_Match":
return "Englisch (GB)";
default:
return "unbekannt";
}
}
这是我的WPF:
<ComboBox x:Name="cbLanguages"
ItemsSource ="{Binding Languages}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
SelectedValue="{Binding SelectedLanguage}" />
<TextBox Text="{Binding SelectedLanguage.Value, Mode=OneWay}"/>
现在,列表按预期显示,但没有选择任何项目,在文本框内,选择语言正确显示,但如果组合框的选择发生变化,则不会更改。
那么,如何以编程方式更改所选项以及如何在文本框中显示所选项?如果我更改所选语言,这还不够吗?
ItemsSource ="{Binding Languages}"
好的,所以你有一个包含KeyValuePair
集合的组合框,因为Languages
是一个字典。
DisplayMemberPath="Value"
这表示为每个项目显示的文本将是KeyValuePair
的Value
,(语言描述)
SelectedValuePath="Key"
这说明,当选择具有 选择值的项目时,我们应该与KeyValuePair
的Key
进行比较。(语言代码)
SelectedValue="{Binding SelectedLanguage}" />
这会将选择绑定到SelectedLanguage
,它应该是我们刚刚指定的语言代码(字符串)。但是,SelectedLanguage
不是字符串,而是KeyValuePair
。由于您的 ItemsSource 已经是 KeyValuePair 的集合,因此您根本不需要担心SelectedValuePath
和SelectedValue
,您只需使用SelectedItem
即可。
<ComboBox x:Name="cbLanguages"
ItemsSource ="{Binding Languages}"
SelectedItem="{Binding SelectedLanguage}"
DisplayMemberPath="Value" />