我想要一个包含开放串口的comboBox作为项目。但是当串口修改时它会自动更新。
我的方法是:
在Xaml中创建一个这样的组合框:
<ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" ContextMenuOpening="comboBox1_ContextMenuOpening" />
创建一个循环通过端口并将它们添加到comboBox的方法:
public string[] portsManual;
public void adaugaPorturi()
{
if (comboBox1.Items.Count > 0)
{
comboBox1.Items.RemoveAt(0);
}
comboBox1.Items.Add("Select port");
comboBox1.SelectedItem = "Select port";
portsManual = SerialPort.GetPortNames();
foreach (string port in portsManual)
{
comboBox1.Items.Add(port);
}
comboBox1.Items.Refresh();
Array.Clear(portsManual, 0, portsManual.Length);
}
在window.load中调用此方法(因此它可以包含一些东西 - 然后打开端口)并在ContextMenuOpening事件中调用它(每当我单击comboBox来选择项目 - 一个端口,刷新)
注意:我在开始时清除了comboBox项(如果有的话),对于字符串数组也是如此,但它没有更新,这些项仍然是第一次运行此方法的项目!
我试过:ObservableCollection,字符串和数组没有运气。我在这个网站上找到的最多信息。我在想因为只有几个端口,我真的不需要收集或列表。我只是直接添加项目。
BTW,管理员可以编辑这篇文章吗?我不确定文本格式是否合适。答案 0 :(得分:1)
首先,您可能应该使用MVVM和数据绑定,而不是直接从视图的代码隐藏中查询串行端口。
其次,您似乎正在使用错误的事件,如果您希望每次菜单打开时刷新,您应该使用DropDownOpened事件
<ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" DropDownOpened="comboBox1_DropDownOpened" />
在你的代码隐藏中尝试这个
public void InitPorts()
{
RefreshPorts();
comboBox1.SelectedItem = "Select port";
}
public void RefreshPorts()
{
comboBox1.Items.Clear();
comboBox1.Items.Add("Select port");
foreach (var port in SerialPort.GetPortNames())
comboBox1.Items.Add(port);
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
InitPorts();
}
private void ComboBox1_OnDropDownOpened(object sender, EventArgs e)
{
RefreshPorts();
}