Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用自定义类通过代码隐藏填充WPF Combobox?_C#_Wpf_Combobox - Fatal编程技术网

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

C# 如何使用自定义类通过代码隐藏填充WPF Combobox?,c#,wpf,combobox,C#,Wpf,Combobox,我有这门课 public class UILanguagesModel : INotifyPropertyChanged { public UILanguagesModel() { IList<UILanguage> list = new List<UILanguage>(); UILanguage english = new UILanguage(); e

我有这门课

 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; }
    }
公共类UILanguagesModel:INotifyPropertyChanged
{
公共UILanguagesModel()
{
IList list=新列表();
UILanguage english=新UILanguage();
英语.Culture=“en”;
english.SpecCulture=“en-US”;
english.EnglishName=“english”;
UILanguage西班牙语=新UILanguage();
西班牙语:Culture=“es”;
西班牙语:SpecCulture=“es”;
西班牙语。EnglishName=“西班牙语”;
列表。添加(英语);
增列(西班牙文);
_语言=新集合视图(列表);
}
私有只读CollectionView _语言;
专用UIU语言;
公共集合视图语言
{
获取{return\u languages;}
}
公共语言
{
获取{return\u language;}
设置
{
if(_language==value)返回;
_语言=价值;
关于财产变更(“语言”);
}
}
私有void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
公共事件属性更改事件处理程序属性更改;
}
公共密封类语言
{
公共字符串EnglishName{set;get;}
公共字符串区域性{set;get;}
公共字符串SpecCulture{set;get;}
}
我需要填充“EnglishGNAME”WPF组合框

怎么做

谢谢大家!


标记XAML

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

如果在视图的构造函数(与XAML关联的C#文件)中设置:

this.DataContext = new UILanguagesModel ();
然后,它就像绑定一样简单:

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

编辑:如果在视图的构造函数(与XAML关联的C文件)中设置了:

this.DataContext = new UILanguagesModel ();
然后,它就像绑定一样简单:

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

编辑:在将组合框绑定到项目集合时,您可能必须将您的
语言
集合声明为
可观察集合

通常将集合类定义为可观察集合:

public class UILanguages : ObservableCollection<UILanguage>
{
}
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;
    }
} 

将组合框绑定到项目集合时,通常会将集合类定义为ObservableCollection:

public class UILanguages : ObservableCollection<UILanguage>
{
}
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;
    }
} 


@ShoaibShaikh是的,在这里。你为什么要用这种方式为你的用户界面提供多语言支持?可以检测当前系统区域性。我讨厌那些让我选择一种我甚至不能阅读的语言的程序。@Ramhoud。事实上,我将使用这种本地化方式:)因此默认情况下,语言将依赖于系统文化。@Ramhoud。但无论如何,我需要给用户选择其他语言并保留它的可能性。有时中国人不得不在法语微软视窗下使用西班牙语界面。。。你知道我的意思吗?Hahahaha@ShoaibShaikh是的,在这里。你为什么要用这种方式为你的用户界面提供多语言支持?可以检测当前系统区域性。我讨厌那些让我选择一种我甚至不能阅读的语言的程序。@Ramhoud。事实上,我将使用这种本地化方式:)因此默认情况下,语言将依赖于系统文化。@Ramhoud。但无论如何,我需要给用户选择其他语言并保留它的可能性。有时中国人不得不在法语微软视窗下使用西班牙语界面。。。你知道我的意思吗?哈哈哈对不起,我已经照你说的做了,但它并没有填充组合框。我不确定我是否理解你刚才的意思。它与我提供的代码一起工作?很抱歉,我按照你说的做了,但它没有填充combobox。我不确定我是否理解你刚才的意思。它与我提供的代码兼容?谢谢你的帮助!我在使用您的代码片段时出错。错误1“local”是未声明的前缀。第8行,位置10。“XML无效。D:\…我已完成XAML。local只是项目名称空间的XAML名称空间声明,这里是ComboBoxTest。非常感谢!你的解决方案完全适合我。很好用!谢谢你的帮助!我在使用您的代码片段时出错。错误1“local”是未声明的前缀。第8行,位置10。“XML无效。D:\…我已完成XAML。local只是项目名称空间的XAML名称空间声明,这里是ComboBoxTest。非常感谢!你的解决方案完全适合我。很好用!