c# - 如何使用自定义类通过代码隐藏填充 WPF Combobox?

标签 c# wpf combobox

我有这门课

 public class UILanguagesModel : INotifyPropertyChanged
    {
        public UILanguagesModel()
        {
            IList<UILanguage> list = new List<UILanguage>();

            UILanguage english = new UILanguage();
            english.Culture = "en";
            english.SpecCulture = "en-US";
            english.EnglishName = "English";           

            UILanguage spanish = new UILanguage();
            spanish.Culture = "es";
            spanish.SpecCulture = "es-ES";
            spanish.EnglishName = "Spanish";   

            list.Add(english);
            list.Add(spanish);
            _languages = new CollectionView(list);
        }
        private readonly CollectionView _languages;
        private UILanguage _language;

        public CollectionView Languages
        {
            get { return _languages; }
        }

        public UILanguage Language
        {
            get { return _language; }
            set
            {
                if (_language == value) return;
                _language = value;
                OnPropertyChanged("Language");
            }
        }
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

    public sealed class UILanguage
    {
        public string EnglishName { set; get; }

        public string Culture { set; get; }

        public string SpecCulture { set; get; }
    }

我需要使用“EnglisgName”WPF Combobox 进行填充。

怎么做?

谢谢!


标记 XAML

 <ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="0,1,0,0" 
                  Name="cmbLanguages" VerticalAlignment="Top" Width="207" />

最佳答案

将 ComboBox 绑定(bind)到项目集合时,您通常会将集合类定义为 ObservableCollection:

public class UILanguages : ObservableCollection<UILanguage>
{
}

并将您的 ComboBox 绑定(bind)到使用 ObservableCollection 作为源的 CollectionViewSource,如以下 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 });

您可能还想在 UILanguage 类中覆盖 ToString 以显示有用的内容:

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;
    }
} 

关于c# - 如何使用自定义类通过代码隐藏填充 WPF Combobox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913947/

相关文章:

c# - .NET 正则表达式 - 创建字符串?

c# - 如何在 DotNetNuke 中获取门户的当前登录 URL?

c# - 新行在 C#/WPF 中的 MessageBox 中不起作用

c++ - 如何反转qcombobox的方向?

java - 需要在JPanel(Java Swing)中使用多个组合框

c# - 使用 Selenium WebDriver 与 native javascript 衡量性能

c# - 我将如何执行关闭 C# 控制台应用程序的操作?

c# - WPF - 在窗口之间传递依赖关系

.net - 具有 GUI 和控制台模式的 WPF 应用程序

php - 使用组合框从表中获取数据(Codeigniter)