1

我想要一个包含开放串行端口作为项目的组合框。但是当串口修改时它会自动更新。

我的方法是这样的:

  1. 在 Xaml 中创建一个组合框,如下所示:

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" ContextMenuOpening="comboBox1_ContextMenuOpening" />
    
  2. 创建一个循环槽端口并将它们添加到组合框的方法:

    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);
    }
    
  3. 在 window.load 调用这个方法(这样它可以有一些东西 - 端口随即打开)并在 ContextMenuOpening 事件中调用它(每当我单击组合框来选择一个项目 - 一个端口,刷新)

注意:我在开始时清除了组合框项目(如果有的话),对于字符串数组也是如此,但它没有更新,这些项目仍然是该方法第一次运行时的项目!

我尝试过:ObservableCollection、字符串和数组都没有运气。我在这个网站上找到的最多信息。我在想,因为只有几个端口,我真的不需要集合或列表。我只是直接添加项目。

顺便说一句,管理员可以编辑这篇文章吗?我不确定文本格式是否良好。

4

1 回答 1

2

首先,您可能应该使用 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();
}
于 2013-01-28T19:25:27.107 回答