在运行时 WPF 刷新组合框项



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

我的方法是这样的:

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

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" ContextMenuOpening="comboBox1_ContextMenuOpening" />
    
  2. 创建一个循环槽端口并将其添加到 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);
    }
    
  3. 在 window.load 调用此方法(因此它可以包含一些内容 - 然后打开的端口)并在 ContextMenuOpen 事件中调用它(每当我单击 comboBox 选择一个项目 - 一个端口,刷新)

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

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

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

首先,您可能应该使用 MVVM 和数据绑定,而不是直接从视图的代码隐藏中查询串行端口。

其次,似乎您使用了错误的事件,如果您希望每次菜单打开时刷新它,则应使用 DropDownTOpen 事件

<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();
}

最新更新