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。非常感谢!你的解决方案完全适合我。很好用!