当我在 WPF 窗口中添加了一个组合框后,如何向组合框添加项目?Int 设计或 NameOfWindow.xaml.cs 文件中的 XAML 代码?
7 回答
案例 1 - 您没有数据源:
您可以ComboBox
按如下方式填充静态值 -
- 来自 XAML:
<ComboBox Height="23" Name="comboBox1" Width="120">
<ComboBoxItem Content="Alice"/>
<ComboBoxItem Content="Bob"/>
<ComboBoxItem Content="Charlie"/>
</ComboBox>
- 来自 CodeBehind - 1:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
comboBox1.Items.Add("Alice");
comboBox1.Items.Add("Bob");
comboBox1.Items.Add("Charlie");
}
- 来自 CodeBehind - 2:
// insert item at specified index of populated ComboBox
private void Window_Loaded(object sender, RoutedEventArgs e)
{
comboBox1.Items.Insert(2, "Alice");
comboBox1.Items.Insert(5, "Bob");
comboBox1.Items.Insert(8, "Charlie");
}
案例 2 - 您有一个数据源,并且项目永远不会更改:
您可以使用数据源来填充ComboBox
. 任何 IEnumerable
类型都可以用作数据源。你可以 -
ItemsSource
将属性绑定XAML
到数据源,例如 -
<!-- MyDataSource is an IEnumerable type property in ViewModel -->
<ComboBox Height="23" Width="120" ItemsSource="{Binding MyDataSource}" />
- 将数据源分配给
ItemsSource
代码隐藏中的属性,例如 -
private void Window_Loaded(object sender, RoutedEventArgs e)
{
comboBox1.ItemsSource = new List<string> { "Alice", "Bob", "Charlie" };
}
案例 3 - 您有一个数据源,并且项目可能会更改
- 您应该使用 an
ObservableCollection<T>
作为数据源 - 您应该
ItemsSource
将属性绑定XAML
到数据源(如上所示) - 您可以在代码隐藏中将数据源分配给
ItemsSource
属性(如上所示)
使用 anObservableCollection<T>
可确保无论何时将项目添加到数据源或从数据源中删除,更改都会立即反映在 UI 上。如何填充ObservableCollection<T>
.
最好构建ObservableCollection并利用它
public ObservableCollection<string> list = new ObservableCollection<string>();
list.Add("a");
list.Add("b");
list.Add("c");
this.cbx.ItemsSource = list;
cbx 是组合框名称
另请阅读:List、ObservableCollection 和 INotifyPropertyChanged 之间的区别
用这个
string[] str = new string[] {"Foo", "Bar"};
myComboBox.ItemsSource = str;
myComboBox.SelectedIndex = 0;
或者
foreach (string s in str)
myComboBox.Items.Add(s);
myComboBox.SelectedIndex = 0;
您可以从 XAML 或 .cs 填充它。用数据填充控件的方法很少。您最好阅读有关 WPF 技术的更多信息,它允许根据您的需要以多种方式做很多事情。根据您的项目需求选择方法更为重要。你可以从这里开始。这是一篇关于创建组合框并用一些数据填充它的简单文章。
有很多方法可以执行此任务。这是一个简单的:
<Window x:Class="WPF_Demo1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="TestWindow"
Title="MainWindow" Height="500" Width="773">
<DockPanel LastChildFill="False">
<StackPanel DockPanel.Dock="Top" Background="Red" Margin="2">
<StackPanel Orientation="Horizontal" x:Name="spTopNav">
<ComboBox x:Name="cboBox1" MinWidth="120"> <!-- Notice we have used x:Name to identify the object that we want to operate upon.-->
<!--
<ComboBoxItem Content="X"/>
<ComboBoxItem Content="Y"/>
<ComboBoxItem Content="Z"/>
-->
</ComboBox>
</StackPanel>
</StackPanel>
<StackPanel DockPanel.Dock="Bottom" Background="Orange" Margin="2">
<StackPanel Orientation="Horizontal" x:Name="spBottomNav">
</StackPanel>
<TextBlock Height="30" Foreground="White">Left Docked StackPanel 2</TextBlock>
</StackPanel>
<StackPanel MinWidth="200" DockPanel.Dock="Left" Background="Teal" Margin="2" x:Name="StackPanelLeft">
<TextBlock Foreground="White">Bottom Docked StackPanel Left</TextBlock>
</StackPanel>
<StackPanel DockPanel.Dock="Right" Background="Yellow" MinWidth="150" Margin="2" x:Name="StackPanelRight"></StackPanel>
<Button Content="Button" Height="410" VerticalAlignment="Top" Width="75" x:Name="myButton" Click="myButton_Click"/>
</DockPanel>
</Window>
接下来,我们有 C# 代码:
private void myButton_Click(object sender, RoutedEventArgs e)
{
ComboBoxItem cboBoxItem = new ComboBoxItem(); // Create example instance of our desired type.
Type type1 = cboBoxItem.GetType();
object cboBoxItemInstance = Activator.CreateInstance(type1); // Construct an instance of that type.
for (int i = 0; i < 12; i++)
{
string newName = "stringExample" + i.ToString();
// Generate the objects from our list of strings.
ComboBoxItem item = this.CreateComboBoxItem((ComboBoxItem)cboBoxItemInstance, "nameExample_" + newName, newName);
cboBox1.Items.Add(item); // Add each newly constructed item to our NAMED combobox.
}
}
private ComboBoxItem CreateComboBoxItem(ComboBoxItem myCbo, string content, string name)
{
Type type1 = myCbo.GetType();
ComboBoxItem instance = (ComboBoxItem)Activator.CreateInstance(type1);
// Here, we're using reflection to get and set the properties of the type.
PropertyInfo Content = instance.GetType().GetProperty("Content", BindingFlags.Public | BindingFlags.Instance);
PropertyInfo Name = instance.GetType().GetProperty("Name", BindingFlags.Public | BindingFlags.Instance);
this.SetProperty<ComboBoxItem, String>(Content, instance, content);
this.SetProperty<ComboBoxItem, String>(Name, instance, name);
return instance;
//PropertyInfo prop = type.GetProperties(rb1);
}
注意:这是使用反射。如果您想了解更多关于反射的基础知识以及为什么要使用它,这是一篇很棒的介绍性文章:
如果您想详细了解如何将反射与 WPF 结合使用,请参阅以下资源:
如果你想大幅提升反射的性能,最好使用 IL 来做到这一点,如下所示:
我认为comboBox1.Items.Add("X");
会添加string
到 ComboBox,而不是ComboBoxItem
.
正确的解决方案是
ComboBoxItem item = new ComboBoxItem();
item.Content = "A";
comboBox1.Items.Add(item);
使用 OleDBConnection -> 连接到 Oracle
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "Provider=MSDAORA;Data Source=oracle;Persist Security Info=True;User ID=system;Password=**********;Unicode=True";
OleDbCommand comd1 = new OleDbCommand("select name from table", con);
OleDbDataReader DR = comd1.ExecuteReader();
while (DR.Read())
{
comboBox_delete.Items.Add(DR[0]);
}
con.Close();
就这样 :)