При связывании ComboBox с коллекцией элементов вы обычно определяете класс коллекции как ObservableCollection:
public class UILanguages : ObservableCollection<UILanguage>
{
}
и привяжите ваш ComboBox к CollectionViewSource, который использует ObservableCollection в качестве источника, как объявлено в следующем XAML. CollectonViewSource отслеживает выбранный элемент.
<Window x:Class="ComboBoxTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ComboBoxTest"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:UILanguages x:Key="UILanguages"/>
<CollectionViewSource x:Key="UILanguagesViewSource" Source="{StaticResource UILanguages}"/>
</Window.Resources>
<Grid>
<ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="0,1,0,0"
Name="cmbLanguages" VerticalAlignment="Top" Width="207"
ItemsSource="{Binding Source={StaticResource UILanguagesViewSource}}"/>
</Grid>
</Window>
Затем заполните коллекцию:
UILanguages languages = (UILanguages)Resources["UILanguages"];
languages.Add(
new UILanguage
{
Culture = "en",
SpecCulture = "en-US",
EnglishName = "English"
});
languages.Add(
new UILanguage
{
Culture = "es",
SpecCulture = "es-ES",
EnglishName = "Spanish"
});
Конечно, также возможно определить ObservableCollection и CollectionViewSource в коде, что позволяет избежать объявлений ресурсов XAML:
UILanguages languages = new UILanguages();
languages.Add(
new UILanguage
{
Culture = "en",
SpecCulture = "en-US",
EnglishName = "English"
});
languages.Add(
new UILanguage
{
Culture = "es",
SpecCulture = "es-ES",
EnglishName = "Spanish"
});
CollectionViewSource cvs = new CollectionViewSource
{
Source = languages
};
cmbLanguages.SetBinding(ItemsControl.ItemsSourceProperty, new Binding { Source = cvs });
Вы также можете переопределить ToString в своем классе UILanguage, чтобы отобразить что-то полезное:
public sealed class UILanguage
{
public string EnglishName { set; get; }
public string Culture { set; get; }
public string SpecCulture { set; get; }
public override string ToString()
{
return EnglishName;
}
}